【问题标题】:How to get chunks of submatrices faster?如何更快地获得子矩阵块?
【发布时间】:2019-06-17 20:19:08
【问题描述】:

我有一个非常大的矩阵 (nxn),我将为其构建尺寸为 mxm 的相交图块(子矩阵)。每个连续子矩阵之间会有一个step 的偏移量。这是n=8, m=4, step=2 的示例:

import numpy as np
matrix=np.random.randn(8,8)
n=matrix.shape[0]
m=4
step=2

这将存储所有角索引(x,y),我们将从中获取 4x4 natrix:(x:x+4,x:x+4)

a={(i,j) for i in range(0,n-m+1,step) for j in range(0,n-m+1,step)}

子矩阵会这样提取

sub_matrices = np.zeros([m,m,len(a)])
for i,ind in enumerate(a):
    x,y=ind
    sub_matrices[:,:,i]=matrix[x:x+m, y:y+m]

有没有更快的方法来初始化这个子矩阵?

【问题讨论】:

    标签: python python-3.x numpy


    【解决方案1】:
    import numpy as np
    
    a = np.random.randn(n, n)
    
    b = a[0:m*step:step, 0:m*step:step]
    

    如果你有一个一维数组,你可以通过下面的代码得到它的子矩阵:

    c = a[start:end:step]
    

    如果维度是两个或更多,则在每个维度之间添加逗号。

    d = a[start1:end1:step1, start2:end3:step2]
    

    【讨论】:

      【解决方案2】:

      我们可以利用基于np.lib.stride_tricks.as_stridedscikit-image's view_as_windows 来获得滑动窗口。 More info on use of as_strided based view_as_windows.

      from skimage.util.shape import view_as_windows   
      
      # Get indices as array 
      ar = np.array(list(a))
      
      # Get all sliding windows
      w = view_as_windows(matrix,(m,m))
      
      # Get selective ones by indexing with ar
      selected_windows = np.moveaxis(w[ar[:,0],ar[:,1]],0,2)
      

      或者,我们可以使用列表解析提取行和列索引,然后使用这些索引,就像这样 -

      R = [i[0] for i in a]
      C = [i[1] for i in a]
      selected_windows = np.moveaxis(w[R,C],0,2)
      

      从一开始就进行优化,我们可以跳过步进数组a的创建,只需将step arg与view_as_windows一起使用,就像这样 -

      view_as_windows(matrix,(m,m),step=2)
      

      这将给我们一个4D 数组,并索引到它的前两个轴将拥有所有mxm 形状的窗口。这些窗口只是输入视图,因此没有额外的内存开销以及几乎免费的运行时间!

      【讨论】:

      • 有没有办法在使用这种方法时找到重叠窗口的交集?
      猜你喜欢
      • 2020-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      • 2013-08-14
      • 1970-01-01
      • 2017-02-13
      相关资源
      最近更新 更多