Преобразование 1-D массива дискретных значений в массив nD непрерывных значений в Numpy

Лучше всего это сделать: с учетом 1-D массива дискретных переменных размера N (здесь N = 4), а X – количество уникальных элементов, я пытаюсь создать многомерный массив размера (N * X), ​​где элементы 1 или 0 в зависимости от появления элементов в 1-D массиве, например, после array_1D (N = 4 и X = 3) приведет к array_ND размера 3 * 4:

array_1D = np.array([x, y, z, x]) array_ND = [[1 0 0 1] [0 1 0 0] [0 0 1 0]] 

Благодаря,

Асо

Попробуй это:

 (np.unique(a)[..., None] == a).astype(np.int) 

Вы можете оставить часть .astype(np.int) если хотите булевой массив. Здесь мы использовали широковещательную передачу (часть [..., None] ), чтобы избежать явного цикла.

Сломанный, как было предложено в комментариях:

 >>> import numpy as np >>> a = np.array([1, 2, 3, 1]) >>> unique_elements = np.unique(a) >>> result = unique_elements[..., None] == a >>> unique_elements array([1, 2, 3]) >>> result array([[ True, False, False, True], [False, True, False, False], [False, False, True, False]], dtype=bool) 

Если исходный массив содержит действительные индексы от 0 до n - 1 вы можете написать

 eye = np.eye(3) array_1D = np.array([0, 1, 2, 0]) array_ND = eye[array_1D] 

Полученная матрица будет

 array([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.], [ 1., 0., 0.]]) 

который является транспонированием того, которого вы ожидаете.

Что здесь происходит, так это то, что numpy использует элементы array_1D как индексы строк eye . Таким образом, результирующая матрица содержит столько строк, сколько элементов array_1D и каждая из них относится к соответствующему элементу. ( 0 относится к 1 0 0 и т. Д.)