【问题标题】:build matrix from blocks从块构建矩阵
【发布时间】:2015-04-21 04:34:59
【问题描述】:

我有一个由两个量 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 中还有一个更简单的函数可以做到这一点。

【问题讨论】:

  • 给其他读者的注释。该图像的原点位于右下角,而result 的数字显示则位于右上角。

标签: python numpy matrix


【解决方案1】:

np.einsum 让您可以稍微简化tensordot 表达式:

result = np.einsum('ij,kl->ikjl',a,b).reshape(-1, na * nb)

我认为没有办法消除reshape

它也可能更容易推广到更多数组,但我不会在一个 einsum 表达式中被太多迭代变量冲昏头脑。

【讨论】:

    【解决方案2】:

    我想我终于找到了解决办法:

    np.kron(a,b)
    

    然后我可以用

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多