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

ski*_*yho 5 python numpy matrix

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

块矩阵

图中,大写字母代表一个3×3的块矩阵,小写字母代表数字(块矩阵的均值或总和)。

目前,我只知道如何使用 for 循环来做到这一点

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
Run Code Online (Sandbox Code Playgroud)

但是如果我的矩阵变大或多维,它会变慢,例如:

test_matrix = np.arange(81*2).reshape(2,9,9)

a = np.zeros((2,3,3))
for k in range(2):
    for i in range(3):
        for j in range(3):
            a[k,i,j] = test_matrix[k,3*i:3*(i+1),3*j:3*(j+1)].mean()
print a
Run Code Online (Sandbox Code Playgroud)

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

非常感谢!!

hpa*_*ulj 5

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.]])
Run Code Online (Sandbox Code Playgroud)

在选定轴上进行整形和求和或平均值:

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

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

test.reshape(3,3,3,3).mean(3).mean(1)
Run Code Online (Sandbox Code Playgroud)

对于 3d 阵列,这些工作

test.reshape( 2,3,3,3,3).mean((2,4))
test.reshape(-1,3,3,3,3).mean((2,4))
Run Code Online (Sandbox Code Playgroud)

-1保留原始第一尺寸(或在2D的情况下test,它增加了一个大小1尺寸)。