首页 > 解决方案 > 用索引矩阵检索值的Pythonic方式?

问题描述

我有一个 h×w×3 numpy 数组A和另一个 h×w×2 numpy 数组,它告诉我从每个 (h, w) 位置B获取值的位置。用(h-by-w-by-3)A表示结果矩阵。C

天真地,我能做到

C = np.zeros(A.shape)
for i in range(B.shape[0]):
    for j in range(B.shape[1]):
        C[i, j, :] = A[B[i, j, 0], B[i, j, 1], :]

但我确信有更高效、更 Python 和更快的方法!

标签: pythonnumpy

解决方案


确实有:

>>> import numpy as np
>>> 
>>> h, w = 4, 6
>>> 
>>> A = np.random.randint(0, 100, (h, w, 3))
>>> B = np.random.randint(0, h*w, (h, w, 2)) % [h, w]
>>> 
>>> C = np.zeros(A.shape)
>>> for i in range(B.shape[0]):
...     for j in range(B.shape[1]):
...         C[i, j, :] = A[B[i, j, 0], B[i, j, 1], :]
... 
>>> 
>>> C2 = A[(*np.moveaxis(B, 2, 0),)]
>>> np.all(C == C2)
True

推荐阅读