2017-11-11 59 views
4

的最大元件I具有三維數組:numpy的獲得不min或出三個元件

y = np.random.randint(1,5 ,(50,50,3)) 

我想計算跨越第三軸線(3片)最大和最小,然後通過分剩下的數字/元素。

因此,像這樣:

x = (np.max(y, axis =2) - 2*np.min(y, axis =2))/the third number 

我不知道如何得到第三個數字。 需要注意的是,第三個數字可能等於最小值或最大值:

例如, (5,5,1)

回答

5

雖然通常排序是矯枉過正時,你只需要一個最大值和最小值,在這種情況下,我認爲這是最簡單的。它直接將我們想要的數字放在容易訪問的地方,而不需要任何複雜的算術。

y = np.random.randint(1, 5, (50, 50,3)) 
y2 = y.copy() 
y2.sort(axis=2) 
sout = (y2[...,2] - 2 * y2[...,0])/y2[...,1] 

這給了我

In [68]: (sout == divakar_out).all() 
Out[68]: True 

這通常是一個好兆頭。 ;-)

+0

不壞作爲替代! – Divakar

+0

同樣的答案,剛剛重新安排'min_,med_,max_ = np.sort(y,axis = 2).transpose(2,0 ,1);(max_2 * min_)/ med_' – piRSquared

+0

並且再次變短:x,y,z = np.sort(a).T;((z-2 * x)/ y).T –

4

方法#1

訣竅找到第三個從3減去那些最大和最小索引。當最大和最小索引相同時,即最後一個軸上的所有三個元素都是相同的,第三個元素索引也是相同的。

因此,我們有這樣一個解決方案 -

max_idx = y.argmax(2) 
min_idx = y.argmin(2) 

rem_idx = np.where(max_idx == min_idx, max_idx, 3 - max_idx - min_idx) 
out = (y[all_idx(max_idx, 2)] -2*y[all_idx(min_idx, 2)])/y[all_idx(rem_idx, 2)] 

索引助手功能爲y與指數 -

# https://stackoverflow.com/a/46103129/ @Divakar 
def all_idx(idx, axis): 
    grid = np.ogrid[tuple(map(slice, idx.shape))] 
    grid.insert(axis, idx) 
    return tuple(grid) 

方法2

我們可以得到沿着軸求和並減去最小值和最大值以得到第三個元素並簡單插入公式 -

maxv = np.max(y, axis =2) 
minv = np.min(y, axis =2) 
x = (maxv - 2*minv)/(y.sum(2) - maxv - minv) 
+1

方法2時在我的腦子先去 – piRSquared

+0

@piRSquared是的,你喜歡的總和,顯然點;) – Divakar

+1

這大概總結了我( - : – piRSquared

5

另一種方法是使用np.median

(y.max(2) - 2 * y.min(2))/np.median(y, 2) 
+0

好的,我覺得不好,我沒想到這是我最喜歡的所有解決方案。我認爲我有一個反對中位數的心理障礙,因爲它可以返回一個不在順序中的值的情況,但這不適用於此。 – DSM

+0

我只是想給中間的排序圖層一個名字後纔想到它。當我決定'med_'時,它就變得很明顯。但是,您的解決方案要快得多,因爲它通過一種非常短的分類來解析所有三個組件。 – piRSquared