我如何在类似于Matlab的blkproc(blockproc)函数的块中高效处理numpy数组

我如何在类似于Matlab的blkproc(blockproc)函数的块中高效处理numpy数组,第1张

我如何在类似于Matlab的blkproc(blockproc)函数的块中高效处理numpy数组

以下是使用块的另一种(无循环)方法的示例:

import numpy as npfrom numpy.lib.stride_tricks import as_strided as astA= np.arange(36).reshape(6, 6)print A#[[ 0  1  2  3  4  5]# [ 6  7  8  9 10 11]# ...# [30 31 32 33 34 35]]# 2x2 block viewB= ast(A, shape= (3, 3, 2, 2), strides= (48, 8, 24, 4))print B[1, 1]#[[14 15]# [20 21]]# for preserving original shapeB[:, :]= np.dot(B[:, :], np.array([[0, 1], [1, 0]]))print A#[[ 1  0  3  2  5  4]# [ 7  6  9  8 11 10]# ...# [31 30 33 32 35 34]]print B[1, 1]#[[15 14]# [21 20]]# for reducing shape, processing in 3D is enoughC= B.reshape(3, 3, -1)print C.sum(-1)#[[ 14  22  30]# [ 62  70  78]# [110 118 126]]

因此,仅尝试简单地将

matlab
功能复制到
numpy
并不是所有最佳方式。有时需要“脱帽而出”的思维。

注意
通常,基于跨步技巧的实现 可能会
(但不一定需要)遭受一些性能损失。因此,请做好准备以各种方式衡量您的表现。无论如何,明智的做法是先检查所需的功能(或足够相似,以便轻松适应)是否已在

numpy
或中实现
scipy


更新
请注意,这里没有

magic
涉及任何实际内容
strides
,因此我将提供一个简单的函数来获取
block_view
任何合适的2D
numpy
数组。所以我们开始:

from numpy.lib.stride_tricks import as_strided as astdef block_view(A, block= (3, 3)):    """Provide a 2D block view to 2D array. No error checking made.    Therefore meaningful (as implemented) only for blocks strictly    compatible with the shape of A."""    # simple shape and strides computations may seem at first strange    # unless one is able to recognize the 'tuple additions' involved ;-)    shape= (A.shape[0]/ block[0], A.shape[1]/ block[1])+ block    strides= (block[0]* A.strides[0], block[1]* A.strides[1])+ A.strides    return ast(A, shape= shape, strides= strides)if __name__ == '__main__':    from numpy import arange    A= arange(144).reshape(12, 12)    print block_view(A)[0, 0]    #[[ 0  1  2]    # [12 13 14]    # [24 25 26]]    print block_view(A, (2, 6))[0, 0]    #[[ 0  1  2  3  4  5]    # [12 13 14 15 16 17]]    print block_view(A, (3, 12))[0, 0]    #[[ 0  1  2  3  4  5  6  7  8  9 10 11]    # [12 13 14 15 16 17 18 19 20 21 22 23]    # [24 25 26 27 28 29 30 31 32 33 34 35]]


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5643494.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存