我正在使用 python 实现 Strassen 的矩阵乘法。在划分步骤中,我们将较大的矩阵划分为较小的子矩阵。是否有内置的 numpy 函数来拆分矩阵?
问问题
38835 次
3 回答
19
根据这个答案,您可以使用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))
于 2018-08-19T05:58:34.067 回答
17
不完全是,但是使用数组切片表示法,您应该可以很容易地自己完成。
>>> 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.]])
于 2012-06-19T16:46:57.557 回答
9
我遇到了同样的问题,发现了一些内置的 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 似乎是为此目的而制作的
于 2017-10-11T19:31:04.317 回答