我们可以使用broadacsting
-
(a[:,None] == np.arange(a.max())+1).astype(int)
采样运行 -
In [28]: a = np.array([1,4,2,3,1,2,1,4])
In [29]: a[:,None] == np.arange(a.max())+1 # Booelan array
Out[29]:
array([[ True, False, False, False],
[False, False, False, True],
[False, True, False, False],
[False, False, True, False],
[ True, False, False, False],
[False, True, False, False],
[ True, False, False, False],
[False, False, False, True]], dtype=bool)
In [30]: (a[:,None] == np.arange(a.max())+1).astype(int) # Int array
Out[30]:
array([[1, 0, 0, 0],
[0, 0, 0, 1],
[0, 1, 0, 0],
[0, 0, 1, 0],
[1, 0, 0, 0],
[0, 1, 0, 0],
[1, 0, 0, 0],
[0, 0, 0, 1]])
对于映射整数是不是连续的,并期待任何人都False
列,我们可以直接使用np.unique(a)
比较针对2D
版本的输入阵列a
,像这样 -
In [49]: a = np.array([14,12,33,71,97])
In [50]: a[:,None] == np.unique(a) # Boolean array
Out[50]:
array([[False, True, False, False, False],
[ True, False, False, False, False],
[False, False, True, False, False],
[False, False, False, True, False],
[False, False, False, False, True]], dtype=bool)
In [51]: (a[:,None] == np.unique(a)).astype(int) # Int array
Out[51]:
array([[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1]])
我并不担心0索引,但是这个结果总是会返回一个正方形矩阵,而不是每个唯一值的一列。例如'a = np.array([1,4,2,3,1,2,2,2,2,2,2,2])' –
@KirkBroadhurst是的,我应该使用'a.max()'那里创建范围数组。修复。 – Divakar
我正在使用这种方法,但我认为我需要使用'np.unique(a).size'来代替,然后将这些唯一值映射到列。 Max假设有连续的,并且从0开始。 –