データの3D配列があります。インデックスの2D配列があり、形状はデータ配列の最初の2次元と一致し、データ配列から取得して2D配列を作成するインデックスを指定します。例えば:
from numpy import *
a = arange(3 * 5 * 7).reshape((3,5,7))
getters = array([0,1,2] * (5)).reshape(3,5)
私が探しているのは、a[:, :, getters]
各アイテムの3次元に個別にインデックスを付けることで、形状の配列(3,5)を返すような構文です。ただし、a[:, :, getters]
形状の配列(3,5,3,5)を返します。新しい配列を繰り返して構築することでそれを行うことができますが、これはかなり遅いです:
array([[col[getters[ri,ci]] for ci,col in enumerate(row)] for ri,row in enumerate(a)])
# gives array([[ 0, 8, 16, 21, 29],
# [ 37, 42, 50, 58, 63],
# [ 71, 79, 84, 92, 100]])
きちんとした+速い方法はありますか?