是否有一种通过简单地添加相邻像素来重新缩放矩阵的快速方法?
因此,对于X=N*M
矩阵,您得到一个Y=(N/n) *(N/m)
,其中n * m
是我应在其中添加像素的区域。
我一直在手动执行此操作(通过脚本),但我认为必须有某种方法可以做到这一点。
for i in range(0, X.shape[0]/n):
for j in range(0, X.shape[1]/m):
Y[i, j] = np.sum(X[i*n:i*n+n, j*m:j*m+m])
E.G。
X = [[0 1 2 3]
[2 3 4 5]
[3 4 6 8]
[2 3 4 5]]
Y = [[ 6 14]
[12 23]]
答案 0 :(得分:2)
一种纯粹的numpy方法是将矩阵重塑为更多的轴并在适当的轴上求和。
Y = X.reshape(X.shape[0]/n, n, X.shape[1]/m, m).sum((1, 3))
答案 1 :(得分:1)
您可以使用函数skimage.utils.view_as_blocks
和numpy.sum
对代码进行矢量化处理:
import numpy as np
from skimage.util import view_as_blocks
N, M = 4, 4
n, m = 2, 2
X = np.random.randint(size=(N, M), low=0, high=10)
blocks = view_as_blocks(X, (N//n, M//n))
Y = np.sum(blocks, axis=(-1, -2))
N
和M
必须分别是n
和m
的整数倍。否则,您将收到以下错误:
ValueError:
block_shape
与arr_in
不兼容
样品运行
In [74]: X
Out[74]:
array([[5, 6, 3, 7],
[5, 0, 3, 0],
[6, 1, 8, 0],
[4, 0, 7, 2]])
In [75]: Y
Out[75]:
array([[16, 13],
[11, 17]])