Python 将numpy索引应用于矩阵

Python 将numpy索引应用于矩阵,python,arrays,numpy,Python,Arrays,Numpy,我花了最后一个小时试图弄明白这一点 假设我们有 import numpy as np a = np.random.rand(5, 20) - 0.5 amin_index = np.argmin(np.abs(a), axis=1) print(amin_index) > [ 0 12 5 18 1] # or something similar 这不起作用: a[amin_index] 所以,本质上,我需要为数组np.abs(a)找到沿着某个轴的极小值,然后从数组a的这些位置提取

我花了最后一个小时试图弄明白这一点

假设我们有

import numpy as np
a = np.random.rand(5, 20) - 0.5
amin_index = np.argmin(np.abs(a), axis=1)
print(amin_index)
> [ 0 12  5 18  1] # or something similar
这不起作用:

a[amin_index]
所以,本质上,我需要为数组np.abs(a)找到沿着某个轴的极小值,然后从数组a的这些位置提取值。如何仅对一个轴应用索引

可能很简单,但我想不出来。此外,我不能使用任何循环,因为我必须对具有数百万条目的数组执行此操作。
感谢是因为
argmin
返回每行的列索引(轴为
axis=1
),因此您需要访问这些特定列的每一行:


a[range(a.shape[0]),amin_index]
一种方法是传入行索引数组(例如
[0,1,2,3,4]
)和每个对应行中最小值的列索引列表(您的列表
amin_index

这将返回一个数组,其中包含每行
i
[i,amin\u index[i]]
处的值:

>>> a[np.arange(a.shape[0]), amin_index]
array([-0.0069325 ,  0.04268358, -0.00128002, -0.01185333, -0.00389487])

这是基本索引(而不是高级索引),因此返回的数组实际上是
a
的视图,而不是内存中的新数组。

为什么不简单地通过argmin执行
np.amin(np.abs(a),axis=1)
,如果不需要中间
amin\u索引
数组,那么就简单多了

Numpy是一个很好的资源,请参阅“索引”

编辑:计时总是有用的:

In [3]: a=np.random.rand(4000, 4000)-.5

In [4]: %timeit np.amin(np.abs(a), axis=1)
10 loops, best of 3: 128 ms per loop

In [5]: %timeit a[np.arange(a.shape[0]), np.argmin(np.abs(a), axis=1)]
10 loops, best of 3: 135 ms per loop

就这样,非常感谢。我终于可以睡觉了没问题-很高兴这对我有帮助。我不能使用它,因为我没有在np.abs(a)数组中寻找极小值。我只对这些位置感兴趣,然后从a本身得到最小值。;)