python - numpy 用 2*2 block 的平均值替换数组元素

标签 python arrays numpy matrix

我在 numpy 中有一个 m*n 矩阵。我想将我的矩阵分成 2*2 block ,然后用其 block 中元素的平均值替换每个元素。例如考虑以下数组:

[
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12],
    [13, 14, 15, 16]
]

我想生成这个矩阵:

[
    [3.5, 3.5, 5.5, 5.5]
    [3.5, 3.5, 5.5, 5.5]
    [11.5, 11.5, 13.5, 13.5]
    [11.5, 11.5, 13.5, 13.5]
]

最有效的方法是什么?我应该使用 for 循环吗?

最佳答案

一种方法是将这两个轴中的每一个拆分成另外两个轴,并沿着这两个轴中的后者找到 mean,为我们提供平均值。我们将使用 keepdims=True 保持尺寸,以便稍后使用 np.repeat 沿着缩小的轴复制最终输出。

因此,一种实现方式是 -

b = a.reshape(2,2,2,2).mean((1,3), keepdims=1)
out = np.repeat(np.repeat(b,(2),axis=(1)),(2), axis=3).reshape(4,4)

sample 运行-

In [17]: a
Out[17]: 
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12],
       [13, 14, 15, 16]])

In [18]: b = a.reshape(2,2,2,2).mean((1,3), keepdims=1)

In [19]: np.repeat(np.repeat(b,(2),axis=(1)),(2), axis=3).reshape(4,4)
Out[19]: 
array([[  3.5,   3.5,   5.5,   5.5],
       [  3.5,   3.5,   5.5,   5.5],
       [ 11.5,  11.5,  13.5,  13.5],
       [ 11.5,  11.5,  13.5,  13.5]])

一般来说,解决方案如下所示 -

m,n = a.shape
p,q = (2,2) # Block size
b = a.reshape(m//p,p,n//q,q).mean((1,3), keepdims=1)
out = np.repeat(np.repeat(b,(p),axis=(1)),(q), axis=3).reshape(a.shape)

性能提升

我们可以用基于初始化的部分替换那个复制部分,就像这样 -

out = np.empty((m//p,p,n//q,q),dtype=float)
out[:] = b
out.shape = a.shape

关于python - numpy 用 2*2 block 的平均值替换数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44857697/

相关文章:

android - 使用 Python 进行移动应用程序开发时遇到的挑战

arrays - 散点图 : tall arrays eating up all the memory

java - 应为 BEGIN_ARRAY,但在第 1 行第 5 列为 STRING

python - 大型内存映射数组的高效点积

Python 在大矩阵中查找相似向量的最快方法

python - GAE - 如何组合多个异步 url 获取的结果?

python - 如何在 Windows 上安装 OpenCV 并在不使用包管理器的情况下为 PyCharm 启用它

python - 从 DataFrame 中删除 numpy 数组中包含空值的行

python - 带字符串的 Pandas "diff()"

java - 迭代前缀和的结果