在numpy中获取块矩阵的均值/总和的最佳方法?

时间:2016-08-15 02:37:57

标签: python numpy matrix

我想对块矩阵(或更一般地在d-dim nd.array上)执行一些简单的计算。像这样:

Block matrix

在图片中,大写字母表示3乘3的块矩阵,小写字母表示数字(块矩阵的平均值或总和)。

目前,我只知道如何使用for循环

来做到这一点
@Override
protected DeploymentContext configureDeployment() {
    return ServletDeploymentContext
            .servlet(new ServletContainer(new YourResourceConfig()))
            .addListener(ContextLoaderListener.class)
            .contextParam("contextConfigLocation", "classpath:applicationContext.xml")
            .build();
}

但是如果我的矩阵变得更大或更多维,它会变慢,如下所示:

import numpy as np

test_matrix = np.arange(81).reshape(9,9)
a = np.zeros((3,3))
for i in range(3):
    for j in range(3):
        a[k,i,j] = test_matrix[3*i:3*(i+1),3*j:3*(j+1)].mean()
print a

有没有更好的方法来执行这类任务?

非常感谢!!

1 个答案:

答案 0 :(得分:4)

In [1952]: test=np.arange(81).reshape(9,9)
In [1953]: res=np.zeros((3,3))
In [1954]: for i in range(3):
      ...:     for j in range(3):
      ...:         res[i,j]=test[3*i:3*(i+1),3*j:3*(j+1)].mean()
In [1955]: res
Out[1955]: 
array([[ 10.,  13.,  16.],
       [ 37.,  40.,  43.],
       [ 64.,  67.,  70.]])

对所选轴进行重塑和求和或均值:

In [1956]: test.reshape(3,3,3,3).mean(axis=(1,3))
Out[1956]: 
array([[ 10.,  13.,  16.],
       [ 37.,  40.,  43.],
       [ 64.,  67.,  70.]])

sum / mean允许我们一次指定2个或更多轴,但也可以通过重复的单轴应用来完成。

test.reshape(3,3,3,3).mean(3).mean(1)

对于3d数组,这些工作

test.reshape( 2,3,3,3,3).mean((2,4))
test.reshape(-1,3,3,3,3).mean((2,4))

-1保留原始的第一维(或者在2d test的情况下,它会添加尺寸1尺寸)。