在Python中从2D数组获取非零数据和位置
我有一个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
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)]