多维np.argmax?

时间:2018-08-16 02:30:32

标签: arrays python-3.x numpy

我有一个形状为(n,n,g)的3D数组,我需要每个(n,n)argmax,即结果应该是长度为g的两个索引向量(x,y)每个。

直观的解决方案是:

rotate -pivot 0 0 0 0 0 0 $faceName;

但是,numpy不支持多轴作为参数。

是否有解决方法可以得到此结果?

5 个答案:

答案 0 :(得分:2)

vstack前简单使用argmax

np.argmax(np.vstack(array),0)//5
Out[61]: array([4, 0], dtype=int64)

答案 1 :(得分:2)

N, M, G = array.shape
[np.unravel_index(np.argmax(array[:, :, k]), (N, M)) for k in range(G)]

为简单起见,假设n = 2和g = 3:

import pprint
array = np.random.uniform(size=[2, 2, 3])
N, M, G = array.shape
pprint.pprint([array[:, :, k] for k in range(G)]) 

[array([[ 0.71863395,  0.86051707],
       [ 0.82812069,  0.62037209]]),
 array([[ 0.72423731,  0.59852891],
       [ 0.52208735,  0.0133947 ]]),
 array([[ 0.93927551,  0.99748664],
       [ 0.35097431,  0.48110289]])]

[np.unravel_index(np.argmax(array[:, :, k]), (N, M)) for k in range(G)] # -> [(0, 1), (0, 0), (0, 1)] 

答案 2 :(得分:2)

似乎您正在寻找2D切片的每个扁平版本的二维(行,列)argmax索引,可以说前两个轴已合并/合并。因此,第一个块将是array[:,:,0],依此类推,我们需要找到argmax,并将该切片展平并追溯到原始2D形状。因此,要解决此问题,我们可以简单地重塑形状以合并前两个轴,沿着重塑后合并的第一个轴获得argmax,并使用np.unravel_index追溯原始索引,就像这样-

array2D = array.reshape(-1,array.shape[-1])
r,c = np.unravel_index(array2D.argmax(0),array.shape[:2])

样品运行-

In [29]: array = np.random.uniform(size=[5, 5, 1000])

In [30]: array2D = array.reshape(-1,array.shape[-1])

In [31]: r,c = np.unravel_index(array2D.argmax(0),array.shape[:2])

In [32]: len(r), len(c)
Out[32]: (1000, 1000)

让我们验证第一个2D切片的结果-

In [33]: array[:,:,0]
Out[33]: 
array([[0.81590174, 0.17919069, 0.22717883, 0.67863625, 0.97390595],
       [0.82096447, 0.05894774, 0.86379174, 0.13494354, 0.10003756],
       [0.37243189, 0.33714008, 0.21165031, 0.35910642, 0.15163255],
       [0.1376776 , 0.86866599, 0.43602004, 0.85421372, 0.77805012],
       [0.10519547, 0.7422571 , 0.35632275, 0.24168307, 0.76882613]])

In [34]: array[:,:,0].argmax() 
Out[34]: 4  # flattened index for 0.97390595 at (0,4) in the 2D slice

In [36]: r[0],c[0]
Out[36]: (0, 4)

答案 3 :(得分:1)

让我们尝试

np.column_stack([np.arange(array.shape[0]), array.max(-1).argmax(1)])

这个想法是,第一个索引总是单调递增,因此我们需要的只是第二个索引。

答案 4 :(得分:1)

最简单的方法是先散布然后解开索引。一行:

np.c_[np.unravel_index(np.argmax(a.reshape(-1, a.shape[-1]), axis = 0), a.shape[:-1])]

编辑:刚刚意识到,这基本上是@Divakar的答案,简直就是骨头。但是,它对于两个以上的维度都是有效的