我有一个看起来像这样的清单:
[[0,1,2], [1,2,3], [2,3,4], [3,4,5]]
我可以将其设置为一个数组,例如:
array([[0,1,2],
[1,2,3],
[2,3,4],
[3,4,5]])
因此,我总共有4行,每行有3列。现在,我想查找所有大于2的元素的索引,因此对于整个矩阵,索引应为:
((1,2),(2,1),(2,2),(3,1),(3,2),(3,3))
然后,对于每一行,我将随机选择一个col索引,该索引指示值大于2。现在我的代码如下:
a = np.array([[0,1,2],[1,2,3],[2,3,4],[3,4,5]]
out = np.ones(4)*-1
cur_row = 0
col_list = []
for r,c in np.nonzero(a>2):
if r == cur_row:
col_list.append(c)
else:
cur_row = r
shuffled_list = shuffle(col_list)
out[r-1] = shuffled_list[0]
col_list = []
col_list.append(c)
我希望得到一个看起来像这样的东西:
array([-1, 2, 1, 2])
但是,现在当我运行我的代码时,它显示
ValueError: too many values to unpack
有人知道我该如何解决这个问题?或者我应该怎么做才能实现自己的目标?我只是想尽可能快地运行代码,因此任何其他好主意也非常受欢迎。
尝试这个。
import numpy as np
arr = np.array([[0,1,2],
[1,2,3],
[2,3,4],
[3,4,5]])
indices = np.where(arr>2)
for r, c in zip(*indices):
print(r, c)
印刷
1 2
2 1
2 2
3 0
3 1
3 2
因此,它应该工作。您也可以使用itertools.izip
,在这种情况下,它甚至是更好的选择。
一个纯粹的numpy
解决方案(感谢@AshwiniChaudhary的建议):
for r, c in np.vstack(np.where(arr>2)).T:
...
尽管我不确定这会比使用izip或zip更快。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句