那么,转换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]])