使用 2d 坐标数组从 numpy 中的 2d 数组中选择值

问题描述 投票:0回答:1

在 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
的相应条目。

numpy numpy-ndarray
1个回答
0
投票

正如评论中所建议的,您可以使用高级索引来实现这一点,即

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)
,以便解包分别传递行和列索引。

© www.soinside.com 2019 - 2024. All rights reserved.