在 numpy 中,数组可以通过包含数组索引的其他数组来索引:
>>> x
array([ 4, 16, 64])
>>> inx
array([1, 1, 0, 2, 0, 2, 2, 0, 1, 0, 2, 1, 1, 1, 2, 1, 0, 2, 2, 2])
>>> x[inx]
array([16, 16, 4, 64, 4, 64, 64, 4, 16, 4, 64, 16, 16, 16, 64, 16, 4,
64, 64, 64])
现在假设
x
的形状为(3,3)
,而inx
的形状为(20, 2)
(每行包含完整的二维坐标对),我可以得到像x[inx]
这样的数组,即形状为(20,)
的数组吗?
每行包含 x
的相应条目。
正如评论中所建议的,您可以使用高级索引来实现这一点,即
import numpy as np
x = np.arange(9).reshape(3,3)
rng = np.random.default_rng(42)
inx = rng.integers(0, 3, (20, 2))
print(x[inx[:,0], inx[:,1]]) # array([2, 4, 5, 2, 0, 5, 8, 8, 3, 7, 4, 2, 7, 5, 4, 3, 1, 6, 8, 1])
您可以通过首先转置数组然后解压它来完成相同的操作,但代码更少,即
print(x[*inx.T]) # array([2, 4, 5, 2, 0, 5, 8, 8, 3, 7, 4, 2, 7, 5, 4, 3, 1, 6, 8, 1])
我们需要先转置它,因为解包会分割行,所以我们将
inx
转置为 (2, 20)
,以便解包分别传递行和列索引。