在numpy中乘以包含图像的张量
Multiplying tensors containing images in 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 它应该完成这项工作但我没有得到正确的爱因斯坦指数)也在同一个 link 有一些我无法想象的疯狂张量立方体重塑方法。关于如何解决这个问题的任何建议/想法解释?
你尝试了吗?
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 及更高版本。
我有以下三阶张量。两个张量矩阵第一个张量包含 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 它应该完成这项工作但我没有得到正确的爱因斯坦指数)也在同一个 link 有一些我无法想象的疯狂张量立方体重塑方法。关于如何解决这个问题的任何建议/想法解释?
你尝试了吗?
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 及更高版本。