通过以Numpy或类似单位进行平均来缩小3D矩阵

通过以Numpy或类似单位进行平均来缩小3D矩阵,numpy,matrix,scipy,Numpy,Matrix,Scipy,是否有一种简单的方法可以通过在Numpy或Scipy中,甚至使用NetCDF工具或类似工具平均某个大小的块来减小3D矩阵的大小?我写了一个2D的一个使用步幅前一段时间,但一个随时可用的功能将帮助很多 编辑: 我希望我的输入和输出是什么样子的示例: 输入的形状:500500100 调用函数:downsizeinput,10,10,10,func 输出形状:50、50、10,其中每个单元格的值是连续10x10子矩阵上func的结果 或者,代码可以获得所需的矩阵大小作为输入,而不是子矩阵的大小,并将其

是否有一种简单的方法可以通过在Numpy或Scipy中,甚至使用NetCDF工具或类似工具平均某个大小的块来减小3D矩阵的大小?我写了一个2D的一个使用步幅前一段时间,但一个随时可用的功能将帮助很多

编辑:

我希望我的输入和输出是什么样子的示例:

输入的形状:500500100

调用函数:downsizeinput,10,10,10,func

输出形状:50、50、10,其中每个单元格的值是连续10x10子矩阵上func的结果

或者,代码可以获得所需的矩阵大小作为输入,而不是子矩阵的大小,并将其计算出来


谢谢

我最终将我的2D版本扩展到了3D版本,而且很明显它是有效的。在这里,以防其他人也需要它

import numpy as np
from numpy.lib.stride_tricks import as_strided

# 3D version of my block view function
def block_view(arr, block_size):
    shape   = tuple(_shape / _bsize for _shape, _bsize in zip(arr.shape, block_size)) + block_size
    strides = tuple(_bsize * _stride for _bsize, _stride in zip(block_size, arr.strides)) + arr.strides

    return as_strided(arr, shape=shape, strides=strides)

def aggregate(arr, block_size):
    blocks = block_view(arr, block_size)
    dimension_offset = len(arr.shape)
    block_dimensions = range(dimension_offset, dimension_offset + len(block_size))
    for dim in block_dimensions:
        blocks = np.mean(blocks, axis=dim, keepdims=True)

    blocks = blocks[:, :, :, 0, 0, 0]
    return blocks

我试图使它适用于任何N维矩阵,但唯一的限制是blocks=blocks[:,:,:,0,0]行

这里有一种方法,使用整形将每个轴切成两个,从而创建六个轴,然后对三个原始轴的第二个切片轴执行合并平均,以获得块平均-

def blockwise_average_3D(A,S):    
    # A is the 3D input array
    # S is the blocksize on which averaging is to be performed

    m,n,r = np.array(A.shape)//S
    return A.reshape(m,S[0],n,S[1],r,S[2]).mean((1,3,5))
样本运行-

In [107]: A = np.random.randint(0,255,(500,500,100)) # 3D Input array
     ...: S = (10,10,10)                             # Blocksize
     ...: 

In [108]: out = blockwise_average_3D(A,S)

In [109]: out[0,0,0]
Out[109]: 124.242

In [110]: A[:10,:10,:10].mean()
Out[110]: 124.242

In [111]: out[0,1,0]
Out[111]: 129.89400000000001

In [112]: A[:10,10:20,:10].mean()
Out[112]: 129.89400000000001

?@Divakar我认为这只适用于图像,因为它说3D矩阵需要与其中一种模式兼容。我拥有的是几乎任何可能大小的3D卷,例如500x500x100。你能在上面添加一个mcve吗?哇,比我的方法短得多。谢谢