Python 如何使用argmin的输出作为Numpy的索引
我想在一个秩为3的numpy数组中,找到沿着给定轴的极小值的位置。我已经用Python 如何使用argmin的输出作为Numpy的索引,python,numpy,array-broadcasting,Python,Numpy,Array Broadcasting,我想在一个秩为3的numpy数组中,找到沿着给定轴的极小值的位置。我已经用np.argmin获得了这些位置,但是我不确定如何将其“应用”到原始矩阵以获得实际的最小值 例如: import numpy as np a = np.random.randn(10, 5, 2) min_loc = a.argmin(axis = 0) # this gives an array of shape (5, 2) 现在,问题是如何使用min\u loc获得实际最小值?我试过a[min\u loc],
np.argmin
获得了这些位置,但是我不确定如何将其“应用”到原始矩阵以获得实际的最小值
例如:
import numpy as np
a = np.random.randn(10, 5, 2)
min_loc = a.argmin(axis = 0) # this gives an array of shape (5, 2)
现在,问题是如何使用min\u loc
获得实际最小值?我试过a[min\u loc]
,它给了我一个形状(5,2,5,2)
。这个形状的逻辑是什么?如何使用此辅助矩阵获得形状的合理解(5,2)
请注意,
a.min(axis=0)
不是我要寻找的解决方案。我需要通过argmin
a[min\u loc]
在第一个维度上进行求解,即它将为min\u loc
中的每个索引拾取(5,2)
形数组。由于min\u loc
本身是(5,2)
形状的,并且对于min\u loc
中的每个整数,它会拾取另一个(5,2)
形状的数组。您将得到一个(5,2,5,2)
数组。同样的原因,a[np.数组([0,3])]
的形状是(2,5,2)
,a[np.数组([[0],[3]])]
的形状是(2,1,5,2)
,因为您只提供了第一维的索引
对于您的用例,您不希望为min\u loc
中的每个索引拾取子数组,而是需要一个元素。例如,如果您有min_loc=[[5,…],…]
,则第一个元素应该有一个完整的标记5,0,0
,而不是5,:,:
。这正是我们要做的。基本上,通过为每个维度提供一个整数数组作为索引,您可以拾取对应于特定位置的元素。您可以使用np从(5,2)
形状为第二维度和第三维度构造索引。索引
:
j, k = np.indices(min_loc.shape)
a[min_loc, j, k]
# [[-1.82762089 -0.80927253]
# [-1.06147046 -1.70961507]
# [-0.59913623 -1.10963768]
# [-2.57382762 -0.77081778]
# [-1.6918745 -1.99800825]]
其中j,k
是第二和第三维度的坐标:
j
#[[0 0]
# [1 1]
# [2 2]
# [3 3]
# [4 4]]
k
#[[0 1]
# [0 1]
# [0 1]
# [0 1]
# [0 1]]
或者如@hpaulj所评论的,使用np。沿着轴取\u
方法:
np.take_along_axis(a, min_loc[None], axis=0)
# [[[-0.93515242 -2.29665325]
# [-1.30864779 -1.483428 ]
# [-1.24262879 -0.71030707]
# [-1.40322789 -1.35580273]
# [-2.10997209 -2.81922197]]]
查看
沿\u轴取\u
min_loc
是一个0-9范围内的(5,2)数字数组。它是第一个维度的有效索引,但您已正确索引其他维度<代码>沿_轴取_有助于实现这一点。其他索引数组也需要一起索引(5,2)块(使用广播)。我将您添加到一个长而著名的链中。这在文档中提到,在这里也被打死,但前提是你在搜索中有正确的关键字。“显然,在你错过它们之前,它们很难凭直觉判断出来。”墨菲的建议很糟糕<代码>展开索引不适用于这种情况(我需要沿给定轴的最小值,而不是数组的绝对最小值,因为它是文档中处理的任务)。我花了一段时间才意识到发生了什么…谢谢。沿u轴取u肯定是最优雅的解决方案。但是,带有明确索引的“手工”解决方案肯定有助于澄清我的方法不起作用的原因以及遗漏了什么。