我有一个形状为(n,n,g)的3D数组,我需要每个(n,n)argmax,即结果应该是长度为g的两个索引向量(x,y)每个。
直观的解决方案是:
rotate -pivot 0 0 0 0 0 0 $faceName;
但是,numpy不支持多轴作为参数。
是否有解决方法可以得到此结果?
答案 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的答案,简直就是骨头。但是,它对于两个以上的维度都是有效的