在Python中从2D数组获取非零数据和位置

在Python中从2D数组获取非零数据和位置,python,numpy,Python,Numpy,我有一个2D数组,我希望我能得到所有的非零数据和它们的位置。但现在我只能得到非零的数据位置 有什么方法可以同时获得值和位置吗 import numpy as np groupMatrix = np.array([ [1, 1, 0, 0], [1, 0, 0, 0], [0, 0, 0, 2], [3, 3, 0, 2] ]) res = zip(*np.nonzero(groupMatrix)) print(list(res)) 我得到的结果是[(0,0),(0,1),(1,0),(2

我有一个2D数组,我希望我能得到所有的非零数据和它们的位置。但现在我只能得到非零的数据位置

有什么方法可以同时获得值和位置吗

import numpy as np

groupMatrix = np.array([
[1, 1, 0, 0],
[1, 0, 0, 0],
[0, 0, 0, 2],
[3, 3, 0, 2]
])

res = zip(*np.nonzero(groupMatrix))

print(list(res))
我得到的结果是[(0,0),(0,1),(1,0),(2,3),(3,0),(3,1),(3,3)]

但我希望结果能显示出这一立场的价值

例如,(x,y,z):x,y表示位置,z表示点处的值

(0,0,1),(0,1,1),(1,0,1),(2,3,2),(3,0,3),(3,1,3),(3,3,2)

谢谢你的帮助

print(list(zip(*np.nonzero(groupMatrix),groupMatrix[groupMatrix!=0])))
这当然不是最有效的解决方案(它复制了对非零元素的搜索),但效果很好。


如果您确实需要一个包含信息的元组列表,可以使用
list(zip(*…)


如果你的数组很小,比如你问题中的数组,那么它的可读性和速度都会很快。如果数组较大,则应默认使用矢量化方法



*
错放是一个打字错误。
vstack
的想法正是为了避免使用
list(zip(*…)
。这不是一个“额外”步骤,而是最后一步。如果OP真的需要一个元组列表,我就添加了最后一点。尽管如此,对于我来说,为了将来的使用,持有一个2-D numpy对象听起来比一个元组列表更好。为什么对numpy对象使用列表理解呢?整个班级都是为了避免这样做
i   = np.nonzero(arr)

res = np.vstack([i, arr[i]])
array([[0, 0, 1, 2, 3, 3, 3],
       [0, 1, 0, 3, 0, 1, 3],
       [1, 1, 1, 2, 3, 3, 2]])
>>> list(zip(*res))
[(0, 0, 1), (0, 1, 1), (1, 0, 1), (2, 3, 2), (3, 0, 3), (3, 1, 3), (3, 3, 2)]
[(*i, j) for i, j in np.ndenumerate(arr) if j != 0]
[(0, 0, 1), (0, 1, 1), (1, 0, 1), (2, 3, 2), (3, 0, 3), (3, 1, 3), (3, 3, 2)]