Python 从块构建矩阵

Python 从块构建矩阵,python,numpy,matrix,Python,Numpy,Matrix,我有一个物体,它由两个量来描述,A和B在实际情况下,它们可以超过两个。对象根据A和B的值进行关联。我特别了解A和B的关联矩阵。例如: a = np.array([[1, 1, 0, 0], [1, 1, 0, 0], [0, 0, 1, 1], [0, 0, 1, 1]]) b = np.array([[1, 1, 0], [1, 1, 1], [0, 1,

我有一个物体,它由两个量来描述,A和B在实际情况下,它们可以超过两个。对象根据A和B的值进行关联。我特别了解A和B的关联矩阵。例如:

a = np.array([[1, 1, 0, 0],
              [1, 1, 0, 0],
              [0, 0, 1, 1],
              [0, 0, 1, 1]])
b = np.array([[1, 1, 0],
              [1, 1, 1],
              [0, 1, 1]])
na = a.shape[0]
nb = b.shape[0]
A的相关性:

因此,如果一个元素的A==0.5,而另一个元素的A==1.5,则它们完全相关。否则,如果一个元素的A==0.5,而第二个项目的A==3.5,则它们是不相关的

同样,对于B:

现在我想将两个相关矩阵相乘,但我想得到一个双轴矩阵作为最终矩阵,其中新轴是原始轴的折叠版本:

def get_folded_bin(ia, ib):
    return ia * nb + ib
我现在做的是:

result = np.swapaxes(np.tensordot(a, b, axes=0), 1, 2).reshape(na* nb, na * nb)
视觉上:

特别是,这必须包括:

for ia1 in xrange(na):
    for ia2 in xrange(na):
        for ib1 in xrange(nb):
            for ib2 in xrange(nb):
                assert(a[ia1, ia2] * b[ib1, ib2] == result[get_folded_bin(ia1, ib1), get_folded_bin(ia2, ib2)])
实际上我的问题是用更多的量A,B,C。。。一般来说。也许numpy中还有一个更简单的函数可以实现这一点。

np.einsum允许您稍微简化tensordot表达式:

result = np.einsum('ij,kl->ikjl',a,b).reshape(-1, na * nb)
我不认为有办法消除这种重塑


推广到更多数组可能更容易,但我不会因为一个einsum表达式中包含太多迭代变量而得意忘形。

我想我终于找到了一个解决方案:

np.kron(a,b)
然后我就可以用它来作曲了

np.kron(np.kron(a,b), c)

给其他读者的说明。图像的原点位于右下角,作为结果的数字显示,它位于右上角。