我正在使用Python实现斯特拉森的矩阵乘法。在划分步骤中,我们将较大的矩阵划分为较小的子矩阵。numpy是否有一个内置的函数来分割矩阵?
58wvjzkj1#
根据this answer,你可以使用swapaxes:你可以创建一个helper方法:
swapaxes
def split(array, nrows, ncols): """Split a matrix into sub-matrices.""" r, h = array.shape return (array.reshape(h//nrows, nrows, -1, ncols) .swapaxes(1, 2) .reshape(-1, nrows, ncols))
下面是一个使用它的例子
import numpy as np array = np.array([ [1, 1, 2, 2], [3, 3, 4, 4], [5, 5, 6, 6], [7, 7, 8, 8]]) A, B, C, D = split(array, 2, 2) # A = # [[1 1] # [3 3]] # B = # [[2 2] # [4 4]] # C = # [[5 5] # [7 7]] # D = # [[6 6] # [8 8]] print('A = \n{}\n\n' 'B = \n{}\n\n' 'C = \n{}\n\n' 'D =\n{}'.format(A, B, C, D))
lbsnaicq2#
不完全是,但是使用数组切片符号,你应该可以很容易地自己完成。
>>> A = np.linspace(0,24,25).reshape([5,5,]) >>> A array([[ 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.]])
使B成为A中左上角的2x2:
>>> B = A[0:2,0:2]
注意B是一个视图,它与A共享数据
>>> B[1,1] = 60 >>> print A [[ 0. 1. 2. 3. 4.] [ 5. 60. 7. 8. 9.] [ 10. 11. 12. 13. 14.] [ 15. 16. 17. 18. 19.] [ 20. 21. 22. 23. 24.]]
如果需要从A复制数据,请使用copy方法:
>>> B = A[0:2,0:2].copy() >>> B array([[ 0., 1.], [ 5., 60.]]) >>> B[1,1] = 600 >>> B array([[ 0., 1.], [ 5., 600.]]) >>> A array([[ 0., 1., 2., 3., 4.], [ 5., 60., 7., 8., 9.], [ 10., 11., 12., 13., 14.], [ 15., 16., 17., 18., 19.], [ 20., 21., 22., 23., 24.]])
envsm3lx3#
我遇到了同样的问题,并找到了一些内置的numpy函数将我的矩阵拆分为4个子矩阵(我的矩阵大小为2^N*2^N)下面是我写的代码:
upper_half = np.hsplit(np.vsplit(my_matrix, 2)[0], 2) lower_half = np.hsplit(np.vsplit(my_matrix, 2)[1], 2) upper_left = upper_half[0] upper_right = upper_half[1] lower_left = lower_half[0] lower_right = lower_half[1]
使用numpy重组它们的好处:
C=np.vstack([np.hstack([c11, c12]), np.hstack([c21, c22])])
vsplit hsplit hstack和vstack似乎就是为此而设计的
u3r8eeie4#
与上面的答案没有根本不同,但可能更简洁一些:
A = np.random.randn(4, 4) print(A) B = [np.hsplit(half, 2) for half in np.vsplit(A, 2)] print(B) C = np.block(B) print(C) [[ 0.14577043 -1.01422737 -0.21212882 -1.56080335] [-0.26758559 0.48542432 -0.8508443 1.84165807] [ 0.18615368 -0.55853988 -1.08452365 -0.65183916] [-0.69947061 -1.23371315 1.88217085 -0.65417009]] [[array([[ 0.14577043, -1.01422737], [-0.26758559, 0.48542432]]), array([[-0.21212882, -1.56080335], [-0.8508443 , 1.84165807]])], [array([[ 0.18615368, -0.55853988], [-0.69947061, -1.23371315]]), array([[-1.08452365, -0.65183916], [ 1.88217085, -0.65417009]])]] [[ 0.14577043 -1.01422737 -0.21212882 -1.56080335] [-0.26758559 0.48542432 -0.8508443 1.84165807] [ 0.18615368 -0.55853988 -1.08452365 -0.65183916] [-0.69947061 -1.23371315 1.88217085 -0.65417009]]
4条答案
按热度按时间58wvjzkj1#
根据this answer,你可以使用
swapaxes
:你可以创建一个helper方法:
下面是一个使用它的例子
lbsnaicq2#
不完全是,但是使用数组切片符号,你应该可以很容易地自己完成。
使B成为A中左上角的2x2:
注意B是一个视图,它与A共享数据
如果需要从A复制数据,请使用copy方法:
envsm3lx3#
我遇到了同样的问题,并找到了一些内置的numpy函数将我的矩阵拆分为4个子矩阵(我的矩阵大小为2^N*2^N)
下面是我写的代码:
使用numpy重组它们的好处:
vsplit hsplit hstack和vstack似乎就是为此而设计的
u3r8eeie4#
与上面的答案没有根本不同,但可能更简洁一些: