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的列表,但我想知道是否有更有效的方法来执行它.谢谢你的任何建议.
更新:有关更快的解决方案,请参阅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)
| 归档时间: |
|
| 查看次数: |
537 次 |
| 最近记录: |