将包含图像的张量乘以numpy

时间:2015-12-30 01:52:23

标签: python numpy linear-algebra numpy-broadcasting numpy-einsum

我有以下三阶张量。两个张量矩阵的第一个张量包含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,它应该做的工作,但我没有得到Einsteins索引正确)也在同一个链接有一些疯狂的张量立方体重塑方法,我无法想象。关于如何解决这个问题的任何建议/想法 - 解释?

1 个答案:

答案 0 :(得分: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,...)。重塑几乎是无成本的,是一个很好的numpy工具。

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

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