在Numpy中将离散值的1-D数组转换为连续值的n-D数组

时间:2013-10-30 13:33:24

标签: python numpy multidimensional-array

最好的做法是:给定一个大小为N的离散变量的一维数组(此处N = 4),X是唯一元素的数量,我试图创建一个大小的多维数组(N * X )元素为1或0,取决于1-D数组中元素的出现,例如在array_1D(N = 4和X = 3)之后将得到大小为3 * 4的array_ND:

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

谢谢,

阿苏

2 个答案:

答案 0 :(得分:4)

试试这个:

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

如果需要布尔数组,可以省略.astype(np.int)部分。在这里,我们使用broadcasting[..., 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)

答案 1 :(得分:1)

如果初始数组包含从0n - 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的元素一样多的行,并且它们中的每一个都与相应的元素相关。 (01 0 0等有关。)