那么,转换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-style顺序的row major进行测试并返回”,因此只要每行恰好有一个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]])

10-06 10:34
查看更多