gpt4 book ai didi

pandas - 求和多个长度不均匀的NumPy向量的最快方法

转载 作者:行者123 更新时间:2023-12-03 17:26:51 25 4
gpt4 key购买 nike

问题陈述很简单:给定任意数量的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)

最佳答案

方法1

拥有如此庞大的输入数组大小和更多数量的数组,我们需要提高内存效率,因此建议采用一种循环的方式,一次迭代地累加一个数组-

many_vectors = [v1, v2, v3, v4] # list of all vectors

lens = [len(i) for i in many_vectors]
L = max(lens)
out = np.zeros(L)
for l,v in zip(lens,many_vectors):
out[:l] += v


方法#2

另一个用 masking进行向量化的向量,从那些不规则形状的向量/阵列的列表中生成规则的 2D阵列,然后沿列求和以得到最终输出-

# Inspired by https://stackoverflow.com/a/38619350/ @Divakar
def stack1Darrs(v):
lens = np.array([len(item) for item in v])
mask = lens[:,None] > np.arange(lens.max())
out_dtype = np.result_type(*[i.dtype for i in v])
out = np.zeros(mask.shape,dtype=out_dtype)
out[mask] = np.concatenate(v)
return out

out = stack1Darrs(many_vectors).sum(0)

关于pandas - 求和多个长度不均匀的NumPy向量的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56166217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com