numpy获取条件与坐标一起满足的坐标?

时间:2018-11-23 23:21:26

标签: python numpy

使用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的元素的坐标。我可以做类似的事情:

  • 选择除1、3以外的所有列以及除偶数行以外的所有行
  • 将它们归零

    [[ 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方面)?

1 个答案:

答案 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]])