2017-06-07 84 views
1

我試圖找到沿着特定軸(0)爲3D ndarray的最大值的指數,然後使用這些指數切出這些值(和來自第二個平行陣列的對應值)。例如,切片提取沿軸的最大值,在一個ndarray

> a = np.random.randint(10, 100, 24).reshape(2, 3, 4) 
> print(a) 
array([[[94, 22, 96, 44], 
     [11, 85, 39, 85], 
     [58, 43, 48, 84]], 

     [[84, 58, 51, 30], 
     [74, 89, 90, 11], 
     [90, 54, 94, 20]]]) 

現在,我很感興趣,這給那些在零軸的最大的值的指數,即

> a[inds] 
array([[94, 58, 96, 44], 
     [74, 89, 90, 85,], 
     [90, 54, 94, 84,]]) 

使用a.argmax()給出了零軸指數是最大,即

> a.argmax(axis=0) 
array([[0, 1, 0, 0], 
     [1, 1, 1, 0], 
     [1, 1, 1, 0]]) 

但是這不會對切片工作...

回答

1

使用advanced-indexing在沿着軸/ DIMS其餘創建範圍陣列,像這樣 -

m,n = a.shape[1:] 
Y,Z = np.ogrid[:m,:n] 
Y_max_axis0 = a[inds,Y,Z] 

採樣運行 -

In [15]: a 
Out[15]: 
array([[[94, 22, 96, 44], 
     [11, 85, 39, 85], 
     [58, 43, 48, 84]], 

     [[84, 58, 51, 30], 
     [74, 89, 90, 11], 
     [90, 54, 94, 20]]]) 

In [16]: inds = a.argmax(axis=0) 

In [17]: m,n = a.shape[1:] 
    ...: Y,Z = np.ogrid[:m,:n] 
    ...: Y_max_axis0 = a[inds,Y,Z] 
    ...: 

In [18]: Y_max_axis0 
Out[18]: 
array([[94, 58, 96, 44], 
     [74, 89, 90, 85], 
     [90, 54, 94, 84]]) 

更明確的方式來創建這些範圍的陣列,然後索引 -

In [19]: a[inds,np.arange(a.shape[1])[:,None], np.arange(a.shape[2])] 
Out[19]: 
array([[94, 58, 96, 44], 
     [74, 89, 90, 85], 
     [90, 54, 94, 84]]) 
+0

非常感謝!我需要在我的高級索引中刷新(很多)......但是有一個簡單的理由說明爲什麼第三個軸('np.arange(a.shape [2])')的索引不需要廣播到一個額外的維度(即'np.arange(a.shape [2])[:,None]')? – DilithiumMatrix

+0

@DithithiumMatrix Nah,我們不需要。這就是爲什麼在'explicit-way'中顯示'np.arange(a.shape [2])'的原因。但是使用一個額外的暗淡,如:np.ogrid(前面顯示),我們有np.arange(a.shape [2])[None]也不會傷害。 – Divakar

+1

@DilithiumMatrix'inds'會有'(m,n)'的變暗。我們需要擴展'np.arange(m)',因爲它沿着'inds'的第一個軸,而'np.arange(n)'沿着'inds'的第二個軸。所以,我們需要擴展第一個範圍數組而不是第二個,因爲第二個索引時會自動沿'inds'的第一個軸延伸。 – Divakar