python 如何使用numpy将矩阵拆分为4个块?

ygya80vv  于 2023-04-28  发布在  Python
关注(0)|答案(4)|浏览(197)

我正在使用Python实现斯特拉森的矩阵乘法。在划分步骤中,我们将较大的矩阵划分为较小的子矩阵。numpy是否有一个内置的函数来分割矩阵?

58wvjzkj

58wvjzkj1#

根据this answer,你可以使用swapaxes
你可以创建一个helper方法:

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))
lbsnaicq

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.]])
envsm3lx

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似乎就是为此而设计的

u3r8eeie

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]]

相关问题