我有一个二维矩阵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_dims
和take_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]])
如果我们告诉argmin
到keepdims
(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]])