Numpy:一次索引两个维度

Numpy:一次索引两个维度,numpy,indexing,Numpy,Indexing,我想在一些索引给定的位置上为数组赋值。一个例子将更加清楚: import numpy as np #Dimensions N = 25 n = 50 d = 100 k = 3 p = 7 A = np.random.uniform(size=(N,n,d,d)) A_new_values = np.random.uniform(size=(N,n,k,p)) indexes_new_values = np.random.choice(np.arange(d),size=k*p,repla

我想在一些索引给定的位置上为数组赋值。一个例子将更加清楚:

import numpy as np

#Dimensions
N = 25
n = 50
d = 100
k = 3
p = 7

A = np.random.uniform(size=(N,n,d,d))

A_new_values = np.random.uniform(size=(N,n,k,p))
indexes_new_values = np.random.choice(np.arange(d),size=k*p,replace=False).reshape((k,p))

print(A[:,:,indexes_new_values].shape) 
我希望最后一行生成
(N,N,k,p)
,以便能够将新值分配为:

A[:,:,indexes_new_values] = A_new_values

但这会产生一个错误。我如何将
A\u新值分配给
A
中的支持位置?

如果我理解正确,我认为您可以使用以下内容:

将numpy导入为np
#尺寸
N=25
n=50
d=100
k=3
p=7
np.random.seed(0)
A=np.随机.均匀(大小=(N,N,d,d))
A_new_values=np.random.uniform(大小=(N,N,k,p))
索引新值=np.random.choice(np.arange(d),size=k*p,replace=False)。重塑((k,p))
np.沿轴放置(A,索引新值。重塑(1,1,-1,1),A新值。重塑(N,N,-1,1),轴=2)
打印(np.all(A[10,20,索引\u新值[1,5]]==A\u新值[10,20,1,5]))
#真的

查看一下
索引新值
,它有重复值。。。那么,您希望在哪里插入新值呢?请给出一个例子。好吧,假设它没有重复的值。我画了随机值来构建我的MWE,但我的真实数据(暴露起来很复杂…)没有。我编辑了MWE来纠正这个问题。
A
中的哪个索引应该是
索引新值的元素之一?毕竟,虽然
索引新值是二维的,但它的值只是单个数字。因此,如果
索引新值[2,2]
是,例如
33
,那么
A
中的索引应该是什么?应该是A[:,:,33,33]
?我相信你的问题前后矛盾。您可能希望沿最后两个维度生成
k*p
分散的索引,但在这种情况下,您必须生成最多
d**2
,而不是
d
,并应用现有答案(或等效地,生成最多
d
k*p
索引对)。相反,如果您想沿最后两个维度“切片”a
k x p
子阵列,则必须生成
k+p
索引,每个索引最多为
d
(注意加法而不是乘法)。如果你深入到二维数组的形状
(d1,d2)
,并使其工作起来,这可能会有助于解决这个问题。我认为你是对的,安德拉斯,我的问题是不一致的。我想要的是它在第一条评论中提出的@00。但同样,这个问题是不适定的。我怀疑他们需要生成高达
d**2
的索引,而不是
d
@AndrasDeak啊,我想我明白你的意思了,
k
p
应该对应于
A
的最后两个
d
大小的维度?但是我不确定它是如何工作的,
索引和新值[I,j]
A\u新值[:,:,I,j]
A
之间的关系到底是什么……请看我对这个问题的评论。它要么是你用
d**2
-大小的解释,要么是一对
d
-大小的索引和奇特的索引,要么是子数组定义a'la。