4

我有一个 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]] 这样的索引可以工作,但我上面的代码却不行?

4

3 回答 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])

当您在多个维度上使用花哨的索引(即列表或数组作为索引)时,numpy 将这些数组广播到一个常见的形状,并使用它们来索引数组。您需要在第一个索引数组的末尾添加长度为 1 的额外维度,以使广播正常工作。以下是游戏规则

于 2013-08-27T15:40:19.337 回答
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)]
于 2013-08-27T15:38:33.823 回答
3

回答您关于它为什么不起作用的问题:当您使用列表/数组作为索引时,Numpy 使用一组与使用切片不同的索引语义。您可以在文档中看到完整的故事,正如该页面所说,它“可能有点令人难以置信”。

如果你想为不连续的元素做这件事,你必须了解那个复杂的索引机制。

于 2013-08-27T15:48:11.870 回答