2017-05-29 79 views
0

有喜欢的数组:最快的方式在3D阵列搜索在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循环?什么是最快的方式呢?

回答

4

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

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

这就是工作,THX。什么剂量轴做? –

+0

@pdshah执行减少查找沿该轴的任何匹配。更多信息 - ['ufuncs docs'](https://docs.scipy.org/doc/numpy/reference/ufuncs.html)。 – Divakar

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)