2017-08-01 50 views
-1

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

这是我要总结的数组:

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]] 

然后总结列,但也许有更好的方法来做到这一点?

回答

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] 
+0

谢谢你,有没有办法在Python 2.7做到这一点? –

+3

@SergieManchado在Python 2.7'zip_longest()'被命名为'izip_longest()' – Gribouillis

2

添加零是没关系我想。

此外,你可以这样做:

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

随着filter(None)你避免无输入/输出指数值。

希望它能帮助你。

编辑:这只适用于python-2.x。它会在python-3.x上抛出一个异常。

+1

值得一提的是,这只适用于python-2.x。它会在python-3.x上抛出一个异常 – MSeifert

+0

@ MSeifert肯定,thx兄弟。我编辑了这篇文章:) –

2

虽然map做工精细,所建议here所以一般认为更“Python化”使用列表解析(达到同样的效果):

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

这里阵列使用zip(* ...)构建有效的移调。使用正常的zip()运算符,最短的列将决定长度。但是,对于itertools.zip_longest(),可以使用最长的列作为长度,使用fillvalue填充其他列。

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

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) 
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]) 
+0

我真的很喜欢这个。我有一天需要学习这只熊猫... – Gribouillis