假设我有一组矩阵作为 numpy 数组。我想创建下面定义的块矩阵。
我正在寻找一种干净、优雅且易于解释的方式在 numpy 中执行此操作。我试过这个np.block
:
a1, a2 = np.full((2, 2), 1), np.full((2, 2), 2)
out = np.block([[a1, (a1+a2)/2],
[(a1+a2)/2, a2]])
但这种方法不能推广到任意数量的矩阵。
我发现的一种通用方法如下:
A = np.array([a1, a2])
out = (A[:, :, None, :] + A.transpose(1, 0, 2)[None, :, :, :]).reshape(n * m, -1)
但是那个,虽然效率很高,但相当难以阅读(这段代码的阅读频率要比编写的频率高得多)。
scipy.linalg.block_diag
让我走到一半,但我没有得到非对角线。
谁能想到一个好的替代解决方案?我正在考虑研究 numpy 的从函数生成数组的例程,但还没有找到解决此问题的好方法。