在numpy中对数组的子集进行平均

我有一个形状不规则的阵列(10,10,10,60)。 尺寸可以是任意的,但这只是一个例子。

我想通过在一些子集上取平均值来减少这个数组(10, 10, 10, 20) ,我有两种情况:

1 :取每个(10, 10, 10, 20)块的平均值,即具有三个(10, 10, 10, 20)块,并取三者之间的平均值。 这可以通过以下方式完成: m = np.mean((x[..., :20], x[..., 20:40], x[...,40:60]), axis=3) 。 我的问题是,如果没有编写一些显式循环,最后一个维度是任意的,我怎么能生成这个? 所以,我可以做一些事情:

x = np.random.rand(10, 10, 10, 60)
result = np.zeros((10, 10, 10, 20))
offset = 20
loops = x.shape[3] // offset
for i in range(loops):
    index = i * offset
    result += x[..., index:index+offset]
result = result / loops

然而,这似乎不太pythonic,我想知道是否有一个更优雅的方式来做到这一点。

2 :另一种情况是我想将它分解成10个形状的阵列(10, 10, 10, 2, 3) ,然后在这10个阵列之间的第5维上取平均值,然后将其重新设置为(10, 10, 10, 20)阵列的原始计划。 我可以重塑阵列,然后再次取平均值并再次重塑,但第二部分看起来相当不雅。


您可以将最后一个坐标轴重新分成两部分,这样第一个坐标轴的长度就是所需坐标的数量,然后沿着第二个坐标轴获取平均值/平均值 -

m,n,r = x.shape[:3]
out = x.reshape(m,n,r,3,-1).mean(axis=-2) # 3 is no. of blocks

或者,我们可以引入np.einsum以显着提升性能 -

In [200]: x = np.random.rand(10, 10, 10, 60)

In [201]: %timeit x.reshape(m,n,r,3,-1).mean(axis=-2)
1000 loops, best of 3: 430 µs per loop

In [202]: %timeit np.einsum('ijklm->ijkm',x.reshape(m,n,r,3,-1))/3.0
1000 loops, best of 3: 214 µs per loop
链接地址: http://www.djcxy.com/p/68105.html

上一篇: averaging over subsets of array in numpy

下一篇: Numpy mean and std over every terms of arrays