最好的做法是:给定一个大小为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]]
谢谢,
阿苏
答案 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)
如果初始数组包含从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
等有关。)