Python 如何在numpy中使用多维索引访问值?
我在访问给定索引中的值时遇到问题:Python 如何在numpy中使用多维索引访问值?,python,arrays,numpy,Python,Arrays,Numpy,我在访问给定索引中的值时遇到问题: indices = array([[[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2], [3, 3]], [[1, 2], [1, 3], [1, 4], [2, 2], [2,
indices = array([[[1, 1],
[1, 2],
[1, 3],
[2, 1],
[2, 2],
[2, 3],
[3, 1],
[3, 2],
[3, 3]],
[[1, 2],
[1, 3],
[1, 4],
[2, 2],
[2, 3],
[2, 4],
[3, 2],
[3, 3],
[3, 4]],
[[2, 1],
[2, 2],
[2, 3],
[3, 1],
[3, 2],
[3, 3],
[4, 1],
[4, 2],
[4, 3]],
[[2, 2],
[2, 3],
[2, 4],
[3, 2],
[3, 3],
[3, 4],
[4, 2],
[4, 3],
[4, 4]]])
对于阵列:
padded_x = array([[0, 0, 0, 0],
[0, 1, 1, 0],
[0, 1, 1, 0],
[0, 0, 0, 0]])
我尝试使用result=padded_x[index]
访问,但它返回的结果是shape(4,9,2,4)
,我需要它在shape(4,9)
中。我不想使用for循环,因为我处理的是非常大的数组
上下文:索引表示点
[i,j]
处的3x3邻域索引。为了防止越界数组访问,原始数组已被填充(因此名称为padded_x
)Numpy在要访问多个多维索引时有一些奇怪的索引规则
您必须为每个维度提供一个包含iterable的元组。
因此,当您想要访问padded_x
的(0,0)
和(2,3)
时,您必须编写padded_x[([0,2],[0,3])
以你为例,它应该是
indices = (
[[-1, -1, -1, 0, 0, 0, 1, 1, 1],
[-1, -1, -1, 0, 0, 0, 1, 1, 1],
[0, 0, 0, 1, 1, 1, 2, 2, 2],
[0, 0, 0, 1, 1, 1, 2, 2, 2]],
[[-1, 0, 1, -1, 0, 1, -1, 0, 1],
[0, 1, 2, 0, 1, 2, 0, 1, 2],
[-1, 0, 1, -1, 0, 1, -1, 0, 1],
[0, 1, 2, 0, 1, 2, 0, 1, 2]]
)
padded_x = np.array([[0, 0, 0, 0],
[0, 1, 1, 0],
[0, 1, 1, 0],
[0, 0, 0, 0]])
result = padded_x[indices]
请注意,可以通过转置从您尝试的索引创建工作索引数组:index=tuple(index.transpose((2,0,1))
它必须是一个元组,numpy才能将其视为多维索引!否则它将被视为1D索引的列表。不幸的是,列表中的第一个代码块缺少逗号,因此我们无法创建
索引
@gofvonx我刚刚添加了逗号,所以索引
是(4,9,2),您希望索引[:,:,0]
为第一个维度编制索引,并且索引[:,:,:,1]
对于第二个问题?显然不需要重塑,您可以将索引列表的形状保留在元组中,因此我删除了答案的这一部分。