通过两个数组的矩阵索引numpy数组

mw3dktmi  于 2023-05-17  发布在  其他
关注(0)|答案(2)|浏览(123)

我有一个2D numpy数组

weights = np.array(
    [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9],
    ]
)

我有两个一维numpy数组,我想用它们来索引权重

positions1 = np.array([2, 1, 0])
positions2 = np.array([1, 1, 0])

如果我想得到遍历数组的结果,并索引到矩阵中,我可以这样做

print(weights[positions1[...], positions2[...]])

然后得到[8 5 1]
但是现在我想索引到矩阵中所有可能的位置1和位置2的组合,这样我就得到了一个像这样的矩阵

[
[weights[2, 1], weights[2, 1], weights[2, 0]],
[weights[1, 1], weights[1, 1], weights[1, 0]],
[weights[0, 1], weights[0, 1], weights[0, 0]],
]

所以呢

[
[weights[pos1[0], pos2[0]], weights[pos1[0], pos2[1]], weights[pos1[0], pos2[2]]],
[weights[pos1[1], pos2[0]], weights[pos1[1], pos2[1]], weights[pos1[1], pos2[2]]],
[weights[pos1[2], pos2[0]], weights[pos1[2], pos2[1]], weights[pos1[2], pos2[2]]],
]

在numpy中做这件事的规范方法是什么?我知道这有点像外积,但我实际上并不想将数组中的值相乘,而是将它们的值作为元组索引到矩阵中。

b0zn9rqh

b0zn9rqh1#

您需要更改第一个索引器的形状:

weights[positions1[:,None], positions2]

或者用一个广义的版本,正如Chrysophylaxs所指出的:

weights[np.ix_[positions1, positions2]]

输出:

array([[8, 8, 7],
       [5, 5, 4],
       [2, 2, 1]])
w3nuxt5m

w3nuxt5m2#

另一种可能的解决方案:

weights[*np.meshgrid(positions1, positions2, indexing='ij')]

如果上面的方法在你的Python版本上不起作用,你可以使用@mozway的建议:

weights[tuple(np.meshgrid(positions1, positions2, indexing='ij'))]

输出:

array([[8, 8, 7],
       [5, 5, 4],
       [2, 2, 1]])

相关问题