Постановка задачи проста: задано произвольное количество 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)