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)
有没有更好的方法来执行此类任务?
非常感谢!!
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尺寸)。
| 归档时间: |
|
| 查看次数: |
1672 次 |
| 最近记录: |