如何从列表/ ndarray获取索引?

gladys0313

我有一个看起来像这样的清单:

[[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

有人知道我该如何解决这个问题?或者我应该怎么做才能实现自己的目标?我只是想尽可能快地运行代码,因此任何其他好主意也非常受欢迎。

埃利·科维戈(Eli Korvigo)

尝试这个。

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章