如何在Python中基于2D数组对NumPy 3D数组进行索引?

如何在Python中基于2D数组对NumPy 3D数组进行索引?,python,arrays,numpy,Python,Arrays,Numpy,假设我有一个形状为(66,5)的NumPy数组a,和形状为(100,66,5)的B A的元素将索引B的第一维度(axis=0),其中值从0到99(即B的第一维度为100) 例如,A[4,1]将采用B第一维度的索引7、B第二维度的索引4和B第三维度的索引1 我想要的是生成形状为(66,5)的数组C,其中包含B中的元素,这些元素是根据A中的元素选择的(使用NumPy库的函数): 您可以使用来执行此操作: 将numpy导入为np np.random.seed(0) a=np.random.randin

假设我有一个形状为(66,5)的NumPy数组
a
,和形状为(100,66,5)的
B

A
的元素将索引
B
的第一维度(
axis=0
),其中值从0到99(即
B
的第一维度为100)

例如,A[4,1]将采用
B
第一维度的索引7、
B
第二维度的索引4和
B
第三维度的索引1

我想要的是生成形状为(66,5)的数组
C
,其中包含
B
中的元素,这些元素是根据
A

中的元素选择的(使用
NumPy
库的函数):

您可以使用来执行此操作:

将numpy导入为np
np.random.seed(0)
a=np.random.randint(100,大小=(66,5))
b=np.random.random(大小=(100,66,5))
c=np。沿_轴取_(b,a[np.newaxis],轴=0)[0]
#测试一些元素
打印(c[25,3]==b[a[25,3,25,3])
#真的

如果我理解正确,您正在寻找
B
第一维度的索引。您可以使用
np.index
创建
B
的其他两个维度所需的索引,并使用高级索引:

idx = np.indices(A.shape)
C = B[A,idx[0],idx[1]]
例如:

B = np.random.rand(10,20,30)
A = np.array([[   1,    0,    0,    1,    0],
       [   0,    2,    0,    2,    4],
       [   1,    7,    0,    5,    5],
       [   2,    1,    0,    1,    7],
       [   0,    7,    0,    1,    4],
       [   0,    0,    3,    6,    0]])

print(C[4,1]==B[7,4,1])
#True

一个玩具的例子可以帮助我们更好地理解。
A
是布尔掩码还是索引数组?当你说轴=0时,你是指第一个元素还是第一个维度?(axis指维度,我看不出3D数组axis=0的所有元素上的2D索引将如何生成2D数组。@Ehsan很难给出一个玩具示例。但是,我已经在编辑中尽了最大努力进行了解释。我建议添加对代码功能的解释。希望您能解释一下您的建议edit按照您的要求做了什么。I have增加了一个例子,do check.
[0]
c=np的末尾是什么。沿_轴取_(b,a[np.newaxis],axis=0)[0]
?@Aqee
np。沿_轴取_
要求两个参数具有相同数量的维度,尽管它们可以广播。因此,我向
a
添加了一个初始单态维度[np.newaxis],然后结果是
(1,66,5)
,所以我用
[0]
从结果中挤出这个维度。这相当于做
np.expand\u dims(a,0)
np.square(np.沿着轴(…),0)挤压
idx = np.indices(A.shape)
C = B[A,idx[0],idx[1]]
B = np.random.rand(10,20,30)
A = np.array([[   1,    0,    0,    1,    0],
       [   0,    2,    0,    2,    4],
       [   1,    7,    0,    5,    5],
       [   2,    1,    0,    1,    7],
       [   0,    7,    0,    1,    4],
       [   0,    0,    3,    6,    0]])

print(C[4,1]==B[7,4,1])
#True