Как разбить матрицу на 4 блока с помощью numpy?

Я выполняю умножение матрицы Штрассена с помощью python. На шаге деления мы делим большую матрицу на более мелкие подматрицы. Есть ли встроенная функция numpy для разбиения матрицы?

+6
источник поделиться
2 ответа

Не совсем, но с использованием нотации нотации массива вы можете легко сделать это сами.

>>> 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 верхним левым 2x2 в A:

>>> 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, используйте метод копирования:

>>> 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.]])
+11
источник

Я столкнулся с той же проблемой и нашел некоторые встроенные функции 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, кажется, сделаны для этой цели

+2
источник

Посмотрите другие вопросы по меткам или Задайте вопрос