将一个热行向量的numpy数组转换为索引的列向量

ct_*_*hon 3 python arrays performance numpy vectorization

那么什么是转换numpy数组的简洁有效的方法,如:

[[0, 0, 1],
[1, 0, 0],
[0, 1, 0]]
Run Code Online (Sandbox Code Playgroud)

进入如下列:

[[2],
 [0],
 [1]]
Run Code Online (Sandbox Code Playgroud)

其中每列中的数字是一个热矢量的原始数组中"1"的索引值?

我正在考虑循环遍历行并创建索引值为1的列表,但我想知道是否有更有效的方法来执行它.谢谢你的任何建议.

War*_*ser 6

更新:有关更快的解决方案,请参阅Divakar的回答.


您可以使用numpy数组的nonzero()方法.它返回的元组的第二个元素是你想要的.例如,

In [56]: x
Out[56]: 
array([[0, 0, 1, 0],
       [0, 0, 1, 0],
       [0, 0, 0, 1],
       [0, 0, 0, 1],
       [1, 0, 0, 0]])

In [57]: x.nonzero()[1]
Out[57]: array([2, 2, 3, 3, 0])
Run Code Online (Sandbox Code Playgroud)

根据文档字符串numpy.nonzero(),"输入的值a总是以行主,C风格的顺序进行测试和返回",所以只要每行中只有一个1,x.nonzero()[1]就会给出每行1的位置,从第一行开始.(并且x.nonzero()[0]将等于range(x.shape[0]).)

要将结果作为具有shape(n,1)的数组,您可以使用该reshape()方法

In [59]: x.nonzero()[1].reshape(-1, 1)
Out[59]: 
array([[2],
       [2],
       [3],
       [3],
       [0]])
Run Code Online (Sandbox Code Playgroud)

或者您可以索引[:, np.newaxis]:

In [60]: x.nonzero()[1][:, np.newaxis]
Out[60]: 
array([[2],
       [2],
       [3],
       [3],
       [0]])
Run Code Online (Sandbox Code Playgroud)