2016-10-21 31 views
2

我有一个简单的numpy数组(例如[1,4,2,3,1]),并且希望将其投影到二进制矩阵中,其中数组中的每个值都映射到该矩阵的该列中的指示符。将多类数组投影到二进制矩阵中

例如,该阵列将映射到像矩阵:

[1], => [1,0,0,0], 
[4], [0,0,0,1], 
[2], [0,1,0,0], 
[3], [0,0,1,0], 
[1]  [1,0,0,0] 

我可以迭代和列表内涵做到这一点,但有一个优雅的解决方案numpy的?

回答

3

我们可以使用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

我并不担心0索引,但是这个结果总是会返回一个正方形矩阵,而不是每个唯一值的一列。例如'a = np.array([1,4,2,3,1,2,2,2,2,2,2,2])' –

+0

@KirkBroadhurst是的,我应该使用'a.max()'那里创建范围数组。修复。 – Divakar

+0

我正在使用这种方法,但我认为我需要使用'np.unique(a).size'来代替,然后将这些唯一值映射到列。 Max假设有连续的,并且从0开始。 –