如何将Numpy对象数组类型的9x9分块矩阵转换为36x36完整矩阵
方案1:使用np.block直接拼接
np.block是Numpy专门用于拼接分块矩阵的内置函数,你只需要把object类型的分块矩阵转成嵌套列表传入即可,写法非常直观:
import numpy as np full_matrix = np.block(A.tolist())
方案2:使用维度变换实现(效率更高)
如果你的分块矩阵尺寸很大,用维度重排的方式性能会更好,几乎没有额外的内存开销:
full_matrix = A.reshape(N, N, sizeOfBlock, sizeOfBlock)\ .transpose(0, 2, 1, 3)\ .reshape(N * sizeOfBlock, N * sizeOfBlock)
原理说明:
- 第一步
reshape把原来(9,9)的object数组展开为(9,9,4,4)的四维数组,后两个维度对应每个分块的尺寸 transpose(0,2,1,3)调整轴顺序,把行方向的维度、列方向的维度分别放到一起- 最后一步
reshape直接合并维度得到(36,36)的完整矩阵
你可以用下面的代码验证结果正确性:
# 测试用例:修改个别分块验证拼接结果 A[0,0] = np.ones((sizeOfBlock, sizeOfBlock)) A[1,2] = np.full((sizeOfBlock, sizeOfBlock), 2) # 验证两种方法输出结果完全一致 print(np.allclose(np.block(A.tolist()), A.reshape(N,N,4,4).transpose(0,2,1,3).reshape(36,36))) # 输出:True
内容的提问来源于stack exchange,提问作者user8458838
相关产品推荐
相关产品推荐

