2017-05-29 26 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)