numpy查找argmax指向的最大值

numpy查找argmax指向的最大值,numpy,Numpy,我有一个三维阵列。我使用argmax沿轴查找最大值的索引。现在如何使用这些索引来获得最大值? 第二部分:如何对N-d阵列执行此操作 例如: 如果u[e]产生了预期的结果就好了,但它不起作用。沿轴的argmax的返回值不能简单地用作索引。它仅在1d情况下有效 In [124]: u = np.arange(12).reshape(3,4,1) In [125]: e = u.argmax(axis=2) In [126]: u.shape Out[126]: (3, 4, 1) In [127]:

我有一个三维阵列。我使用argmax沿轴查找最大值的索引。现在如何使用这些索引来获得最大值? 第二部分:如何对N-d阵列执行此操作

例如:


如果u[e]产生了预期的结果就好了,但它不起作用。

沿轴的
argmax
的返回值不能简单地用作索引。它仅在1d情况下有效

In [124]: u = np.arange(12).reshape(3,4,1)
In [125]: e = u.argmax(axis=2)
In [126]: u.shape
Out[126]: (3, 4, 1)
In [127]: e.shape
Out[127]: (3, 4)
e
是(3,4),但它的值只索引
u
的最后一个维度

In [128]: u[e].shape
Out[128]: (3, 4, 4, 1)
相反,我们必须为其他两个维度构建索引,即用
e
广播的维度。例如:

In [129]: I,J=np.ix_(range(3),range(4))
In [130]: I
Out[130]: 
array([[0],
       [1],
       [2]])
In [131]: J
Out[131]: array([[0, 1, 2, 3]])
它们是(3,1)和(1,4)。它们与(3,4)
e
和所需输出兼容

In [132]: u[I,J,e]
Out[132]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
这类问题以前有人问过,所以可能应该标记为重复。事实上,您的最后一个维度大小为1,因此
e
都是0,这会分散读者对根本问题的注意力(使用多维
argmax
作为索引)


假设您在最后一个维度上使用了argmax

In [156]: ij = np.indices(u.shape[:-1])
In [157]: u[(*ij,e)]
Out[157]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
或:


如果轴在中间,则需要更多的元组摆放来排列<代码> ij>代码>元素和<代码> e < /代码> .

所以对于一般n-数组

dims = np.ix_(*[range(x) for x in u.shape[:-1]])
u.__getitem__((*dims,e))

你不能写u[*dims,e],这是一个语法错误,所以我认为你必须直接使用getitem

argmax(2)
没有任何意义,因为三维只有一个元素。
u[e]
将在第三个轴上给你最大值,但因为这个轴上的每一行只有一个元素,它返回唯一一个元素的索引,该元素的索引为0。我可能会用注释“it would nice…”把人们弄糊涂了。这不是问题。我的问题是“我现在如何使用argmax返回的索引来获得最大值?”和“如何推广到N-d数组?”同样的原则也适用-生成可广播索引以使用
e
<代码>*在某些情况下,解包会使这更容易。查看我的编辑。
u[(*ij,e)]
有效
u[i,j]
u[(i,j)]
相同,即存在一个隐式元组。因此,将其明确化是很好的。
ij = np.ix_(*[range(i) for i in u.shape[:-1]])
dims = np.ix_(*[range(x) for x in u.shape[:-1]])
u.__getitem__((*dims,e))