Python 从numpy中的索引矩阵创建新矩阵

Python 从numpy中的索引矩阵创建新矩阵,python,arrays,numpy,Python,Arrays,Numpy,我有一个带形状(k,l,m)的3D numpy数组a,和一个带形状(k,l)的2D numpy数组B,其中索引(介于0和m-1之间),我想创建一个带形状(k,l)的新2D数组C,如下所示: import numpy as np A = np.random.random((2,3,4)) B = np.array([[0,0,0],[2,2,2])) C = np.zeros((2,3)) for i in range(2): for j in range(3): C[i,

我有一个带形状(k,l,m)的3D numpy数组
a
,和一个带形状(k,l)的2D numpy数组
B
,其中索引(介于0和m-1之间),我想创建一个带形状(k,l)的新2D数组
C
,如下所示:

import numpy as np
A = np.random.random((2,3,4))
B = np.array([[0,0,0],[2,2,2]))
C = np.zeros((2,3))
for i in range(2):
    for j in range(3):
        C[i,j] = A[i, j, B[i,j]]

有更有效的方法吗?

使用Numpy库函数的内置例程名
。并将代码转换为

C = np.fromfunction(lambda i, j: A[i, j, B[i,j]], (5, 5))

使用Numpy库的函数
中的内置例程名称
。并将代码转换为

C = np.fromfunction(lambda i, j: A[i, j, B[i,j]], (5, 5))
设置:



使用整数索引选择值,然后重塑形状

x,y = np.indices(a.shape[:-1])
c = a[x,y,b]
print(c)


使用

设置:



使用整数索引选择值,然后重塑形状

x,y = np.indices(a.shape[:-1])
c = a[x,y,b]
print(c)


使用


你应该包括一个最小的数据示例-
a
B
对不起,我刚刚修正了你应该包括一个最小的数据示例-
a
B
对不起,我刚刚修正了谢谢!它给了我20倍的加速!我只需要将
dtype='int'
传递给
np.fromffunction
,因为
I
j
被用作索引库!它给了我20倍的加速!我只需要将
dtype='int'
传递给
np.fromffunction
,因为
I
j
被用作索引
[[ 3  4 11]
 [14 17 22]]
x,y = np.ix_(np.arange(a.shape[0]),np.arange(a.shape[1]))
d = a[x,y,b]