用 numpy 形成一个特定的(平均)块矩阵

计算科学 矩阵 麻木的
2021-11-27 04:45:52

假设我有一组矩阵作为 numpy 数组。我想创建下面定义的块矩阵。n×nA1,...,Am

在此处输入图像描述

我正在寻找一种干净、优雅且易于解释的方式在 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]])

但这种方法不能推广到任意数量的矩阵。m

我发现的一种通用方法如下:

A = np.array([a1, a2])
out = (A[:, :, None, :] + A.transpose(1, 0, 2)[None, :, :, :]).reshape(n * m, -1)

但是那个,虽然效率很高,但相当难以阅读(这段代码的阅读频率要比编写的频率高得多)。

scipy.linalg.block_diag让我走到一半,但我没有得到非对角线。

谁能想到一个好的替代解决方案?我正在考虑研究 numpy 的从函数生成数组的例程,但还没有找到解决此问题的好方法。

1个回答
mats_row=np.array([[A1,A2,A3,...,A_n]]) #Create array of matrices with shape (1,M,N,N)
mats_column=np.transpose(mats_row,(1,0,2,3)) #Make a copy with shape (M,1,N,N)
block=.5*(mats_row+mats_column) #Add, broadcasting to a (M,M,N,N) array

这是通过利用 Numpy 的广播功能来实现的。基本思想类似于如果您将每行为 [A_1,A_2,..A_n] 的矩阵添加到每的矩阵中,但广播允许您永远这样做明确地形成这些中间体矩阵。[A1,A2,..An][A1,A2,..An]