gpt4 book ai didi

python - 如何更快地获取子矩阵 block ?

转载 作者:行者123 更新时间:2023-11-28 22:13:02 26 4
gpt4 key购买 nike

我有一个非常大的矩阵 (nxn),我将为其构建尺寸为 mxm 的相交图 block (子矩阵)。每个连续的子矩阵之间会有一个 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]

有没有更快的方法来进行子矩阵初始化?

最佳答案

我们可以利用 np.lib.stride_tricks.as_strided基于 scikit-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 形状的窗口。这些窗口只是输入的 View ,因此没有额外的内存开销,而且几乎没有运行时间!

关于python - 如何更快地获取子矩阵 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54340851/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com