【问题标题】:fastest way to search in 3D array in numpy在 numpy 中搜索 3D 数组的最快方法
【发布时间】:2017-05-29 08:18:13
【问题描述】:

有一个像这样的数组:

array([
   [[X1, Y1, 80, 13, 14],
    [17, 54, 47, 67, 45],
    [11, 21, 67, 45, 11],
    [15, 75, 17, 69, 12]],

   [[X2, Y2, 94, 51, 10],
    [64, 81, 90, 80, 67],
    [78, 73, 19,  6, 57],
    [46, 18, 83, 26, 56]],

    ...

   [[Xn, Yn, 32,  3, 82],
    [47, 69, 63, 20, 10],
    [16, 48,  7, 96, 11],
    [95, 30, 45, 65, 42]] ])

目标是按每个 X 和 Y 进行分组,然后检查每个组中的条件。 为此,我编写代码:

x=npy.random.randint(100,size=(5,4,5))
array([[[36, 47, 80, 13, 14],
        [17, 54, 47, 67, 45],
        [11, 21, 67, 45, 11],
        [15, 75, 17, 69, 12]],

       [[50, 17, 94, 51, 10],
        [64, 81, 90, 80, 67],
        [78, 73, 19,  6, 57],
        [46, 18, 83, 26, 56]],

       [[37, 98, 32,  3, 82],
        [47, 69, 63, 20, 10],
        [16, 48,  7, 96, 11],
        [95, 30, 45, 65, 42]],

       [[59, 36, 38, 95,  3],
        [67, 62, 61, 64, 15],
        [49, 45, 24, 85, 24],
        [23, 89, 23, 63, 14]],

       [[49, 26, 70, 83, 99],
        [16, 94, 78, 43, 33],
        [95,  4, 39, 91, 56],
        [94, 26, 71, 32, 55]]])

for i in range(x.shape[1]):
  for j in range(x.shape[2]):
    npy.any(x[0:3,i,j]>80)

False
True
True
False
True
False
True
True
False
False
False
False
False
True
False
True
False
True
False
False

但是因为我使用的数组非常大,这种方式对我来说效率不高。 有没有更好的写法?是否可以删除 for 循环?最快的方法是什么?

【问题讨论】:

    标签: python arrays performance numpy


    【解决方案1】:

    IIUC 您可以简单地将前三个元素沿第一个轴切片,与阈值进行比较,然后沿第一个轴查找 ANY 匹配 -

    (x[0:3] > 80).any(axis=0)
    

    【讨论】:

    • @pdshah 减少沿该轴查找任何匹配项。更多信息 - ufuncs docs.
    【解决方案2】:

    如果您要进行很多组(即n 与组的大小相比较大),您甚至可以使用logical_or.reduceat 一次完成所有操作:

    def groupSearch(x, groupSize, c = lambda y: y > 80, axis = 0):
        slices =  np.arange(0 , x.shape[axis] , groupSize)
        return np.logical_or.reduceat(c(x), slices, axis)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-27
      • 2017-10-29
      • 2015-07-27
      • 1970-01-01
      • 2019-08-14
      • 1970-01-01
      相关资源
      最近更新 更多