6 回答
TA贡献1757条经验 获得超7个赞
让我们尝试一下outer
:
np.abs(np.subtract.outer(l3,l4)).ravel()
输出:
array([1, 7, 6, 2, 7, 1])
TA贡献1804条经验 获得超8个赞
问题
最有效地计算可迭代对象的笛卡尔积并减去结果的 Pythonic 方法。
解决方案
最简单、最Pythonic的方法:
[ abs(i-j) for i,j in itertools.product(list1, list2) ]
根据数据集的大小,您可能需要使用生成器表达式。
( abs(i-j) for i,j in itertools.product(list1, list2) )
请注意,您不需要显式定义 l1 和 l2,因为 itertools.product 采用可n
迭代对象。您可以简单地执行以下操作:
l = [[1], [3,4]] ( abs(i-j) for i,j in itertools.product(*l) )
TA贡献1817条经验 获得超6个赞
import itertools
def computedifference(list1,list2):
return [abs(i-j) for i,j in itertools.product(list1,list2)]
itertools.product 的文档:https://docs.python.org/2/library/itertools.html#itertools.product
TA贡献1772条经验 获得超5个赞
您可以使用numpy 广播来向量化成对差异:
import numpy as np
l1, l2 = [1], [3,4]
l3, l4 = [2,7,8], [1,9]
def computedifference(list1, list2):
l1 = np.array(list1)
l2 = np.array(list2)
return np.abs(l1[:,None] - l2).ravel().tolist()
computedifference(l1,l2)
[2, 3]
computedifference(l3,l4)
[1, 7, 6, 2, 7, 1]
TA贡献1836条经验 获得超13个赞
l1 = [2,7,8]
l2 = [1,9]
def computedDiff(list1,list2):
return([abs(i-j) for i in list1 for j in list2])
print(computedDiff(l1,l2))
好吧,基本上我在这里所做的就是将其压缩为一行,并且只是以列表形式返回整个 for 循环。只是一种更干净的方法,因为它不包含任何其他变量或附加到列表。
添加回答
举报