1

我有以下三阶张量。两个张量矩阵第一个张量包含 100 个 10x9 矩阵,第二个包含 100 个 3x10 矩阵(我刚刚在这个例子中填充了这些矩阵)。

我的目标是将矩阵乘以一对一的对应关系,这将产生一个具有形状的张量: (100, 3, 9)这可以通过一个 for 循环来完成,该循环只压缩两个张量,然后取每个张量的点,但我正在寻找只需使用 numpy 运算符即可。到目前为止,这里有一些失败的尝试

尝试1:

import numpy as np
T1 = np.ones((100, 10, 9))
T2 = np.ones((100, 3, 10))
print T2.dot(T1).shape

尝试 1 的输出:

(100, 3, 100, 9)

这意味着它尝试了所有可能的组合......这不是我所追求的。

实际上没有其他尝试甚至编译。我尝试使用 np.tensordot , np.einsum (在这里阅读https://jameshensman.wordpress.com/2010/06/14/multiple-matrix-multiplication-in-numpy它应该可以完成这项工作,但我没有得到正确的爱因斯坦指数)同样在同一个链接中,还有一些我无法想象的疯狂张量立方体重塑方法。关于如何解决这个问题的任何建议/想法解释?

4

1 回答 1

1

你试过了吗?

In [96]: np.einsum('ijk,ilj->ilk',T1,T2).shape
Out[96]: (100, 3, 9)

我解决这个问题的方法是查看形状:

(100, 10, 9))  (i, j, k)
(100, 3, 10)   (i, l, j)
-------------
(100, 3, 9)    (i, l, k)

两者j相加并抵消。其他的进行到输出。


对于 4d 数组,具有像这样的尺寸 (100,3,2,24 )有几个选项:

重塑为 3d, T1.reshape(300,2,24), 并在重新整形后返回R.reshape(100,3,...)。Reshape 几乎是免费的,而且是一个很好的numpy工具。

einsum为: 添加一个索引np.einsum('hijk,hilj->hilk',T1,T2),只是对 . 的并行使用i

或使用省略号:np.einsum('...jk,...lj->...lk',T1,T2). 此表达式适用于 3d、4d 及以上。

于 2015-12-30T02:11:17.123 回答