【发布时间】:2019-10-03 14:15:15
【问题描述】:
问题陈述很简单:给定任意数量的 NumPy 一维浮点向量,如下所示:
v1 = numpy.array([0, 0, 0.5, 0.5, 1, 1, 1, 1, 0, 0])
v2 = numpy.array([4, 4, 4, 5, 5, 0, 0])
v3 = numpy.array([1.1, 1.1, 1.2])
v4 = numpy.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10])
求和它们的最快方法是什么?
many_vectors = [v1, v2, v3, v4]
使用直接求和函数将不起作用,因为它们的长度可以是任意不均匀的:
>>> result = sum(many_vectors)
ValueError: operands could not be broadcast together with shapes (10,) (7,)
相反,可以求助于pandas 库,该库将提供一个简单的fillna 参数来避免此问题。
>>> pandas.DataFrame(v for v in many_vectors).fillna(0.0).sum().values
array([ 5.1, 5.1, 5.7, 5.5, 6. , 1. , 1. , 1. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 10. ])
但这可能不是最优化的处理方式,因为生产用例将包含大量数据。
In [9]: %timeit pandas.DataFrame(v for v in many_vectors).fillna(0.0).sum().values
1.16 ms ± 97.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
【问题讨论】:
-
你通常有多少这样的数组?
-
sum(v.sum() for v in many_vectors)够快吗? -
@Warren 你的操作结果是
40.4。要生成的结果是array([ 5.1, 5.1, 5.7, 5.5, 6. , 1. , 1. , 1. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 10. ]) -
@Divakar 每箱可能有 100'000 个,每箱有 10'000 个值。
-
@xApple,我明白了——所以“对它们求和”的意思是按元素求和,用 0 填充任何比最长数组短的东西。
标签: pandas performance numpy optimization vector