我有一个 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) ]
Run Code Online (Sandbox Code Playgroud)
然而,这会导致:
ValueError: shape mismatch: objects cannot be broadcast to a single shape
Run Code Online (Sandbox Code Playgroud)
为什么像 myarray[:,[1,2,3,4],[1,2,3,4]] 这样的索引可以工作,但我上面的代码却不起作用?
这就是您对多个维度进行索引的方式:
>>> 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])
Run Code Online (Sandbox Code Playgroud)
当您在多个维度上使用花式索引(即列表或数组作为索引)时,numpy 会将这些数组广播为通用形状,并使用它们来索引数组。您需要在第一个索引数组的末尾添加长度为 1 的额外维度,以便广播正常工作。这是游戏规则。