多个阵列tensordot

时间:2013-04-26 20:47:51

标签: python numpy

我有np.arrays列表,如:

l = [array([0.2,0.3,0.5]),array([0.7,0.3])]

我需要获得外部产品:

array([[0.14, 0.06],
       [0.21, 0.09],
       [0.35, 0.15]])

一般来说:

array([[l[0][0] * l[1][0], l[0][0] * l[1][1]],
       [l[0][1] * l[1][0], l[0][1] * l[1][1]],
       [l[0][2] * l[1][0], l[0][2] * l[1][1]]])

但是对于任何长度的l(> = 2),所以当len(l)== 4时,我将得到4维数组。

我目前的做法是在for循环中使用tensordot:

product = np.tensordot(l[0], l[1], 0)
for i in range(2, len(l)):
    product = np.tensordot(product, l[i], 0)

但我在Python代码中使用它看起来更好。有谁知道如何做更好更快的解决方案?

动机是我需要得到元素乘以两个数组的总和:

result = np.sum(arr * product)

其中arr.shape == product.shape。也许你,聪明的家伙,也可以改善它。

2 个答案:

答案 0 :(得分:2)

也许更简洁:

reduce(lambda x, y: tensordot(x, y, 0), l)

答案 1 :(得分:0)

numpy有一个名为broadcasting的好东西,它遍历数组。因此,如果你有一个x乘1的数组并将它乘以1乘y的数组,你将获得一个x乘y数组。像矩阵一样工作。所以我将只用两行做你想做的一切:

result = np.array((l[0])).reshape((1,len(l[0])))# resizing the first column to make it a 3 by 1 so that numpy broadcasting will work.
print result * l[1] # broadcasting the 3 by 1 by a 1 by 2 to result in your 3 by 2 

你有它!快捷方便!为方便起见,我将把下面的代码放在下面:

import numpy as np
l = [([0.2,0.3,0.5]),([0.7,0.3])]
result = np.array((l[0])).reshape((len(l[0]),1))
print result * l[1]
>>>>aray([[ 0.14  0.06]
 [ 0.21  0.09]
 [ 0.35  0.15]])