如果数组行具有不同的长度,则对数组列求和

时间:2017-08-01 06:29:46

标签: python arrays python-2.7 list sum

我想知道如果行的长度不同,是否可以对数组的列求和。

这是我想要求和的数组:

input_val = [[1, 2, 3, 5],
             [1, 2, 3],
             [1, 2, 3, 4, 5]]

这就是结果:

output_val = [3, 6, 9, 9, 5]

我考虑过在行中添加零的可能性:

input_val = [[1, 2, 3, 5, 0],
             [1, 2, 3, 0, 0],
             [1, 2, 3, 4, 5]]

然后对列进行求和,但也许有更好的方法可以做到这一点?

5 个答案:

答案 0 :(得分:6)

您可以使用itertools.zip_longest

轻松地隐式执行零填充
>>> import itertools
>>> list(map(sum, itertools.zip_longest(*input_val, fillvalue=0)))
[3, 6, 9, 9, 5]

在python-2.x上,该函数有一个不同的名称itertools.izip_longest,你不需要list演员:

>>> import itertools
>>> map(sum, itertools.izip_longest(*input_val, fillvalue=0))
[3, 6, 9, 9, 5]

答案 1 :(得分:2)

添加零,我认为没问题。

另外,你可以这样做:

sum_list = [sum(filter(None, i)) for i in map(None, *input_val)]

使用filter(None),您可以避免使用无/超出索引值。

希望它会对你有所帮助。

编辑:这仅适用于python-2.x.它将在python-3.x上抛出异常。

答案 2 :(得分:2)

虽然map工作正常,但建议here通常会考虑更多“Pythonic”来使用列表理解(达到相同的效果):

import itertools
[sum(col) for col in itertools.zip_longest(*input_val, fillvalue=0)]

这里使用zip(* ...)构造有效地转置数组。使用普通zip()运算符,最短列将决定长度。但是,使用itertools.zip_longest(),可以使用最长的列作为长度,使用fillvalue填充其他列。

实际上,这正是原帖中提出的解决方案,只是以精致的方式实施。

答案 3 :(得分:2)

一个numpy解决方案

import numpy as np
import itertools as itt
np.sum(np.array(list(itt.zip_longest(*input_val, fillvalue=0)), int), axis=1)

答案 4 :(得分:2)

你需要大熊猫,这会让你的生活更轻松:

>>> import numpy
>>> import pandas
>>> i = pandas.DataFrame(input_val).fillna(0).values.astype(numpy.int32)
>>> i
array([[1, 2, 3, 5, 0],
       [1, 2, 3, 0, 0],
       [1, 2, 3, 4, 5]], dtype=int32)
>>> i.sum(axis=0)
array([3, 6, 9, 9, 5])