Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用argmin的输出作为Numpy的索引_Python_Numpy_Array Broadcasting - Fatal编程技术网

Python 如何使用argmin的输出作为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],

我想在一个秩为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]
,它给了我一个形状
(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肯定是最优雅的解决方案。但是,带有明确索引的“手工”解决方案肯定有助于澄清我的方法不起作用的原因以及遗漏了什么。