我有一个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: shape mismatch: objects cannot be broadcast to a single shape
为什么像索引这样的索引myarray [:,[1,2,3,4],[1,2,3,4]]有效,但不是我上面的代码吗?
答案 0 :(得分: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])
当你使用花哨的索引,即列表或数组作为索引,在多个维度上,numpy将这些数组广播到一个共同的形状,并使用它们索引数组。您需要在第一个索引数组的末尾添加长度为1的额外维度,以使广播正常工作。 Here are the rules of the game
答案 1 :(得分:3)
由于您使用连续元素,因此可以使用切片:
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)]
答案 2 :(得分:3)
回答你的问题为什么它不起作用:当你使用列表/数组作为索引时,Numpy使用一组不同的索引语义,而不是使用切片。您可以在the documentation中看到完整的故事,正如该页面所说,它“可能有些令人难以置信”。
如果你想为非连续元素做这件事,你必须理解那种复杂的索引机制。