我想知道如果行的长度不同,是否可以对数组的列求和。
这是我想要求和的数组:
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]]
然后对列进行求和,但也许有更好的方法可以做到这一点?
答案 0 :(得分:6)
>>> 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])