在numpy中搜索3D数组的最快方法

时间:2017-05-29 08:18:14

标签: python arrays performance numpy

有一个像:

这样的数组
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循环?什么是最快的方式?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

如果您打算做很多小组(即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)