import numpy as np
from skimage.measure import block_reduce
arr = np.random.random((6, 6))
area_cell = np.random.random((6, 6))
block_reduce(arr, block_size=(2, 2), func=np.ma.mean)
我想将一个 numpy 数组
arr
从 6 x 6 大小重新排列为 3 x 3。为此使用 skimage 函数 block_reduce。但是,
block_reduce
假设每个网格单元具有相同的大小。当每个网格单元的大小不同时,我该如何解决这个问题?在这种情况下,每个网格单元的大小由 numpy 数组 area_cell
给出- 编辑:
一个例子:
arr
0.25 0.58 0.69 0.74
0.49 0.11 0.10 0.41
0.43 0.76 0.65 0.79
0.72 0.97 0.92 0.09
如果
area_cell
的所有元素都是 1,并且我们要将 4 x 4 arr 转换为 2 x 2,结果将是:0.36 0.48
0.72 0.61
但是,如果
area_cell
如下:0.00 1.00 1.00 0.00
0.00 1.00 0.00 0.50
0.20 1.00 0.80 0.80
0.00 0.00 1.00 1.00
然后,结果变成:
0.17 0.22
0.21 0.54
最佳答案
似乎您仍在按块减少,但是在使用 arr
缩放 area_cell
之后。因此,您只需要在这两个数组之间执行逐元素乘法,并在该乘积数组上使用相同的 block_reduce
代码,就像这样 -
block_reduce(arr*area_cell, block_size=(2, 2), func=np.ma.mean)
或者,我们可以在重塑为产品数组的
np.mean
版本后简单地使用 4D
,如下所示 -m,n = arr.shape
out = (arr*area_cell).reshape(m//2,2,n//2,2).mean(axis=(1,3))
sample 运行 -
In [21]: arr
Out[21]:
array([[ 0.25, 0.58, 0.69, 0.74],
[ 0.49, 0.11, 0.1 , 0.41],
[ 0.43, 0.76, 0.65, 0.79],
[ 0.72, 0.97, 0.92, 0.09]])
In [22]: area_cell
Out[22]:
array([[ 0. , 1. , 1. , 0. ],
[ 0. , 1. , 0. , 0.5],
[ 0.2, 1. , 0.8, 0.8],
[ 0. , 0. , 1. , 1. ]])
In [23]: block_reduce(arr*area_cell, block_size=(2, 2), func=np.ma.mean)
Out[23]:
array([[ 0.1725 , 0.22375],
[ 0.2115 , 0.5405 ]])
In [24]: m,n = arr.shape
In [25]: (arr*area_cell).reshape(m//2,2,n//2,2).mean(axis=(1,3))
Out[25]:
array([[ 0.1725 , 0.22375],
[ 0.2115 , 0.5405 ]])