我有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。也许你,聪明的家伙,也可以改善它。
答案 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]])