numpy的获得不min或出三个元件

问题描述:

的最大元件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)

虽然通常排序是矫枉过正时,你只需要一个最大值和最小值,在这种情况下,我认为这是最简单的。它直接将我们想要的数字放在容易访问的地方,而不需要任何复杂的算术。

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 –

方法#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://*.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

另一种方法是使用np.median

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

好的,我觉得不好,我没想到这是我最喜欢的所有解决方案。我认为我有一个反对中位数的心理障碍,因为它可以返回一个不在顺序中的值的情况,但这不适用于此。 – DSM

+0

我只是想给中间的排序图层一个名字后才想到它。当我决定'med_'时,它就变得很明显。但是,您的解决方案要快得多,因为它通过一种非常短的分类来解析所有三个组件。 – piRSquared