我在这个维度上有一个3D值数组:
(3,m,n)
我有两个1D数组,其中一个arr:i
和另一个arr:j
中的每一项都是索引信息:像(i,j)
index in 3d array:3,i,j
< / p>
例如:
(array([ 0, 0, 0, ..., 637, 638, 639]), array([127, 128, 129, ..., 0, 0, 0]))
因此,我需要使用-dimensions:(3,k,l)
-获得3D数组,该值基于两个1D索引;
尽可能快
如果有人需要,我可以举个例子
答案 0 :(得分:2)
In [39]: arr = np.arange(24).reshape(3,4,2)
In [40]: i, j = np.array([0,2]), np.array([1,0,0])
我们需要对i
和j
进行数组排列,以便它们相互广播以索引一个(2,3)块,或者以初始尺寸为(3,2,3)块进行索引。 np.ix_
是执行此操作的便捷工具,尽管“手动”操作并不困难。
In [41]: idx = np.ix_(np.arange(3),i,j)
In [42]: idx
Out[42]:
(array([[[0]],
[[1]],
[[2]]]),
array([[[0],
[2]]]),
array([[[1, 0, 0]]]))
In [43]: arr[idx]
Out[43]:
array([[[ 1, 0, 0],
[ 5, 4, 4]],
[[ 9, 8, 8],
[13, 12, 12]],
[[17, 16, 16],
[21, 20, 20]]])
In [44]: _.shape
Out[44]: (3, 2, 3)
请注意ix_
生成的数组的形状:
In [45]: [i.shape for i in idx]
Out[45]: [(3, 1, 1), (1, 2, 1), (1, 1, 3)]
以此为指导,我还可以使用以下方法进行索引编制:
arr[:, i[None,:,None], j[None,None,:]]