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
索引对)。相反,如果您想沿最后两个维度“切片”ak 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。