Python 如何获得多维数组的最小值索引数组?

Python 如何获得多维数组的最小值索引数组?,python,multidimensional-array,indexing,Python,Multidimensional Array,Indexing,我有一个多维数组,形状为(2,2,3),如下所示: array([[[ 0.64, 0.49, 2.56], [ 7.84, 13.69, 21.16]], [[ 33.64, 44.89, 57.76], [ 77.44, 94.09, 112.36]]]) 我想找到每一行的最小值的索引。所以这个例子有4个最小值,分别是:0.49,7.84,33.64和77.44 为了得到这些最小值的指数,我认为这是可行的: idx_arr = np.unrav

我有一个多维数组,形状为(2,2,3),如下所示:

array([[[  0.64,   0.49,   2.56],
    [  7.84,  13.69,  21.16]],

   [[ 33.64,  44.89,  57.76],
    [ 77.44,  94.09, 112.36]]])
我想找到每一行的最小值的索引。所以这个例子有4个最小值,分别是:0.49,7.84,33.64和77.44

为了得到这些最小值的指数,我认为这是可行的:

idx_arr = np.unravel_index(np.argmin(my_array,axis=2),my_array.shape)
这将产生以下索引数组:

(array([[0, 0],
    [0, 0]]), array([[0, 0],
    [0, 0]]), array([[1, 0],
    [0, 0]]))
但是,正如人们所看到的,没有正确计算最小值:

my_array[idx_arr]
array([[0.49, 0.64],
   [0.64, 0.64]])

我遗漏了什么?

argmin实际上正在正确计算值。但你误解了人们的期望

从文档:

将平面索引或平面索引数组转换为 坐标数组

要查看它将接受何种输入以提供所需的输出,我们需要关注要点:它将以非平面术语将平面阵列转换为特定位置的正确坐标阵列。本质上,它期望的是所需点的坐标,就好像您的输入数组被展平一样

import numpy as np
inp = np.array([[[  0.64,   0.49,   2.56],
    [  7.84,  13.69,  21.16]],

   [[ 33.64,  44.89,  57.76],
    [ 77.44,  94.09, 112.36]]])

idx = inp.argmin(axis=-1)
#Output:
array([[1, 0],
       [0, 0]], dtype=int64)
请注意,您不能直接发送此
idx
,因为它不代表展平版本的
inp
阵列的正确坐标

这看起来更像如下所示:

flat_idx = np.arange(0, idx.size*inp.shape[-1], inp.shape[-1]) + idx.flatten()
#Output:
array([1, 3, 6, 9], dtype=int64)
我们可以看到,
dislavel\u index
愉快地接受了它

temp = np.unravel_index(flat_idx, inp.shape)
#Output:
(array([0, 0, 1, 1], dtype=int64),
 array([0, 1, 0, 1], dtype=int64),
 array([1, 0, 0, 0], dtype=int64))

inp[temp]
输出:

array([ 0.49,  7.84, 33.64, 77.44])
另外,看看输出元组,我们可以注意到,我们自己重新创建相同的元组并不太困难。请注意,最后一个数组对应于展平形式的
idx
,而前两个数组基本上支持通过
inp
的前两个轴进行索引


为此,我们可以非常巧妙地使用
unlavel\u index
函数,如下所示:

real_idx = (*np.unravel_index(np.arange(idx.size), idx.shape), idx.flatten())
inp[real_idx]
#Output:
array([ 0.49,  7.84, 33.64, 77.44])