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

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

[[0, 0, 1],
[1, 0, 0],
[0, 1, 0]]

进入如下列:

[[2],
 [0],
 [1]]

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

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

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

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

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])

根据docstring of 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]])

或者您可以使用[:,np.newaxis]进行索引:

In [60]: x.nonzero()[1][:, np.newaxis]
Out[60]: 
array([[2],
       [2],
       [3],
       [3],
       [0]])

转载注明原文:python – 将一个热行向量的numpy数组转换为索引的列向量 - 代码日志