Python 有效地将函数应用于系列中的每个可能对
我有一个有20k条目的索引熊猫系列。每个条目都是一个字符串数组Python 有效地将函数应用于系列中的每个可能对,python,pandas,numpy,Python,Pandas,Numpy,我有一个有20k条目的索引熊猫系列。每个条目都是一个字符串数组 id | value 0 | ['abc', 'abc', 'def'] 1 | ['bac', 'c', 'def', 'a'] 2 | ... ...| 20k| ['aaa', 'rzt'] 我想将每个条目(字符串列表)与该系列的每个其他条目进行比较。我有一个复杂的比较函数,它接受两个字符串列表并返回一个浮点 结果应该是一个矩阵 id | 0 | 1 | 2 | ... | 20k 0 | 1 0
id | value
0 | ['abc', 'abc', 'def']
1 | ['bac', 'c', 'def', 'a']
2 | ...
...|
20k| ['aaa', 'rzt']
我想将每个条目(字符串列表)与该系列的每个其他条目进行比较。我有一个复杂的比较函数,它接受两个字符串列表并返回一个浮点
结果应该是一个矩阵
id | 0 | 1 | 2 | ... | 20k
0 | 1 0.5 0.4
1 | 0.5 1 0.2
2 | 0.4 0.2 1
...|
20k|
计算每个矩阵元素的结果的双循环需要我的计算机3个多小时。
如何有效地应用/并行化比较函数?我尝试使用numpy阵列进行广播,但没有成功(没有加速)
这取决于你的功能。我怀疑接受两个字符串列表并返回一个浮点的复杂函数是否可以像x+4矢量化一样“矢量化”。如果是某种模糊匹配,你需要运行400米的计算,所以不会很快。在这种情况下,200米-20000,因为它似乎是对称的。加速的机会主要取决于你想要应用的
compare\u函数的形式。如果计算是独立的,则可以显式地跨CPU核并行化。此外,如果compare_函数
是对称的,则只能计算对角线矩阵并复制到另一个对角线。要应用这两种方法,可以使用中建议的拆分。所有这些都不一定是pandas
支持开箱即用的.Ty。计算是独立的,函数确实是对称的。它计算两个列表之间的特定距离。我将尝试显式并行。我希望numpy/pandas能够使用多核应用一个独立的函数。
values = df['value'].values
broadcasted = np.broadcast(values, values[:,None])
result = np.empty(broadcasted.shape)
result.flat = [compare_function(u,v) for (u,v) in broadcasted]