Python 多维数组中的多元素索引
我有一个3d Numpy数组,我想取一个轴上的平均值,考虑其他二维的某些元素 这是一个描述我的问题的示例代码:Python 多维数组中的多元素索引,python,numpy,Python,Numpy,我有一个3d Numpy数组,我想取一个轴上的平均值,考虑其他二维的某些元素 这是一个描述我的问题的示例代码: import numpy as np myarray = np.random.random((5,10,30)) yy = [1,2,3,4] xx = [20,21,22,23,24,25,26,27,28,29] mymean = [ np.mean(myarray[t,yy,xx]) for t in np.arange(5) ] 然而,这导致: ValueError: sha
import numpy as np
myarray = np.random.random((5,10,30))
yy = [1,2,3,4]
xx = [20,21,22,23,24,25,26,27,28,29]
mymean = [ np.mean(myarray[t,yy,xx]) for t in np.arange(5) ]
然而,这导致:
ValueError: shape mismatch: objects cannot be broadcast to a single shape
为什么像myarray[:,[1,2,3,4],[1,2,3,4]]这样的索引可以工作,但上面的代码却不行?既然使用连续元素,就可以使用切片:
import numpy as np
myarray = np.random.random((5,10,30))
yy = slice(1,5)
xx = slice(20, 30)
mymean = [np.mean(myarray[t, yy, xx]) for t in np.arange(5)]
这就是您在多个维度上创建索引的方式:
>>> np.mean(myarray[np.arange(5)[:, None, None], np.array(yy)[:, None], xx],
axis=(-1, -2))
array([ 0.49482768, 0.53013301, 0.4485054 , 0.49516017, 0.47034123])
当您在多个维度上使用奇特的索引(即列表或数组作为索引)时,numpy会将这些数组广播到公共形状,并使用它们对数组进行索引。您需要在第一个索引数组的末尾添加长度为1的额外维度,以便广播正常工作 要回答您关于它为什么不起作用的问题:当您使用列表/数组作为索引时,Numpy使用的索引语义集与使用切片时不同。您可以在中看到完整的故事,正如该页所说,它“可能有点令人难以置信”
如果要对非连续元素执行此操作,必须探索复杂的索引机制。这就是解决问题的方法,但为什么示例不起作用?谢谢!如果没有连续元素,解决方案是什么?问题是在整数数组子索引的情况下必须遵循广播规则。如果要非连续,请使用布尔索引。如果索引数组不具有相同的形状,则会尝试将它们广播到相同的形状。如果它们不能以相同的形状播放,就会出现一个例外:即使是第二眼,这也让我感到困惑。不管怎样,它是有效的,我非常感谢你的解释!这是令人困惑的,但是如果你想得够久,你最终会发现语法更有意义,并且提供了更一致的行为,特别是在考虑多维索引数组时。当所有索引数组都是1D时,它们本可以实现一种特殊情况,但正如Python的Zen在myarray是掩码数组的情况下所述,我得到:TypeError:元组索引必须是整数,而不是元组。所以屏蔽数组的行为不同?