Numpy index columns



我有一个二维矩阵D

array([[1, 1, 8, 8],
[3, 3, 4, 4],
[8, 8, 1, 1]])

我想通过用amin数组进行索引来找到每列的最低值:

amin = D.argmin(0)
amin
array([0, 0, 2, 2])

如何用amin正确索引D,使返回的数组为array([1, 1, 1, 1])

您需要expand_dimstake_along_axis的组合

np.take_along_axis(D, np.expand_dims(amin, 0), 0)
Out[]: array([[1, 1, 1, 1]])

这可以说不是最直观的公式,但如果不深入numpy的设计理念,我可以说它是";蟒蛇;在这种情况下尽可能。

In [99]: D=np.array([[1, 1, 8, 8],
...:        [3, 3, 4, 4],
...:        [8, 8, 1, 1]])
In [100]: amin = D.argmin(0)
In [101]: amin
Out[101]: array([0, 0, 2, 2])

什么是amin?它每列有一个值,但该值是一个行索引。所以你想要的是:

In [102]: D[amin[0], 0]
Out[102]: 1
In [103]: D[amin[2], 2]
Out[103]: 1

或者同时执行所有列:

In [104]: D[amin, [0,1,2,3]]
Out[104]: array([1, 1, 1, 1])

D[:, amin]这样的表达式试图将amin应用于对列进行索引,而不是对行进行索引。切片同时选择所有行。它无法将它们配对。

也许这些版本会让行动更加清晰:

In [105]: D[[0,0,2,2], [0,1,2,3]]
Out[105]: array([1, 1, 1, 1])
In [106]: [D[i,j] for i,j in zip([0,0,2,2],[0,1,2,3])]
Out[106]: [1, 1, 1, 1]

take_along_axis的作用与[104]相同

In [107]: np.take_along_axis(D, amin[None,:],0)
Out[107]: array([[1, 1, 1, 1]])

如果我们告诉argminkeepdims(v1.22中的一个新功能(,它会更干净一些

In [108]: amin = D.argmin(0, keepdims=True)
In [109]: amin
Out[109]: array([[0, 0, 2, 2]])
In [110]: np.take_along_axis(D, amin,0)
Out[110]: array([[1, 1, 1, 1]])

最新更新