根据单元格面积重构Numpy数组

4
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)

我想将一个6x6大小的numpy数组arr重新调整为3x3。使用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的数组转换为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

我不明白你的意思。你的意思是 block_size 必须具有相同的缩放因子吗?它们可以是任意正整数。 - rayryeng
@rayryeng,我想要进行加权平均而不是简单平均。权重在area_cell中定义。在这种情况下,block_size并不相关。在我的特定用例中,block_size始终具有相同的缩放因子。 - user308827
1
使用一些数字值作为输入元素,并展示预期的输出结果。 - Divakar
@Divakar,已经在问题中添加了一个示例。 - user308827
1个回答

2

看起来你仍在按块减少,但在使用area_cell缩放arr后。因此,你只需要在这两个数组之间执行逐元素乘法,并在该乘积数组上使用相同的block_reduce代码,如下所示 -

block_reduce(arr*area_cell, block_size=(2, 2), func=np.ma.mean)

或者,我们可以在将产品数组重塑为4D版本后,简单地使用np.mean -

m,n = arr.shape
out = (arr*area_cell).reshape(m//2,2,n//2,2).mean(axis=(1,3))

示例运行 -


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 ]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接