在 numpy 中包含图像的相乘张量



我有以下三阶张量。两个张量矩阵 第一个张量包含 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 它应该完成这项工作,但我没有得到正确的爱因斯坦指数(也在同一链接中有一些疯狂的张量立方体整形方法,我没有设法可视化。关于如何解决这个问题的任何建议/想法解释?

你试过吗?

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和并抵消。 其他的则传递到输出。


对于尺寸为 (100,3,2,24 ) 的 4D 数组,有几个选项:

整形为 3d,T1.reshape(300,2,24) ,后整形后R.reshape(100,3,...)。 重塑几乎是无成本的,是一个很好的numpy工具。

einsum中添加索引:np.einsum('hijk,hilj->hilk',T1,T2),只是与i的并行用法。

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

相关内容

  • 没有找到相关文章

最新更新