3

最好的做法是:给定一个离散变量的一维数组大小 N(这里 N=4),X 是唯一元素的数量,我正在尝试创建一个大小为 (N*X) 的多维数组,其中元素为 1 或 0,具体取决于一维数组中元素的出现,例如,跟随 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]]

谢谢,

阿苏

4

2 回答 2

4

尝试这个:

(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)
于 2013-10-30T13:47:23.457 回答
2

如果初始数组包含从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等)

于 2013-10-30T13:48:55.553 回答