使用numpy,获取在单元格值和坐标方面都满足某些条件的2D数组元素的坐标的最快方法是什么?
例如,说我有这个数组:
[[45 78 95 49 98 18 54]
[36 77 92 15 68 25 89]
[29 44 58 18 85 65 43]
[19 63 62 78 48 12 43]
[90 65 17 90 65 44 53]]
并说我想获取第1列和第3列以及事件行中所有> 50的元素的坐标。我可以做类似的事情:
将它们归零
[[ 0 78 0 49 0 0 0]
[36 77 92 15 68 25 89]
[ 0 44 0 18 0 0 0]
[19 63 62 78 48 12 43]
[ 0 65 0 90 0 0 0]]
从结果数组中获取> 50的所有元素的坐标
[[0 1]
[1 1]
[1 2]
[1 4]
[1 6]
[3 1]
[3 2]
[3 3]
[4 1]
[4 3]]
具有这样的内容:
rs = numpy.array([0, 2, 4])[:, None]
cs = numpy.array([0, 2, 4, 5, 6])
a[rs, cs] = 0
res = numpy.argwhere(a > 50)
是否有更快的速度(因为我必须在归零之前复制a
,因为我以后需要它的值)/更短的时间(尤其是在变得更加numpy-y方面)?
答案 0 :(得分:1)
这是使用ogrid
的一种方法:
>>> i, j = np.ogrid[(*map(slice, a.shape),)]
>>> np.argwhere((a>50) & ((i|2==3) | (j|2==3)))
array([[0, 1],
[1, 1],
[1, 2],
[1, 4],
[1, 6],
[3, 1],
[3, 2],
[3, 3],
[4, 1],
[4, 3]])