总结2d阵列python的部分

时间:2016-04-26 06:37:53

标签: python arrays

我有一个维度为array[x][9]的二维数组。 X因为它从不同长度的文件中读取。我想找到数组每列的总和,但一次只能找到24列,并将结果输入到一个新数组中;相当于sum(array2[0:24])但是对于2d数组。是否有一种我不知道的特殊语法,或者我必须手动完成。我知道如果它是一个1d数组我可以通过

来迭代它
for x in range(len(array)/24):
     total.append(sum(array2[x1:x24])) # so i get an array of the sums  

2d数组的等价物是什么,并逐列进行。我可以想象通过将每个列存储在它自己独立的1d数组中然后找到总和,或者乱七八糟的for和while循环来实现它。这两种声音都不是那么优雅。

3 个答案:

答案 0 :(得分:2)

您可以使用zip来转置数组并使用理解来分别对每列求和:

>>> array = [[1, 2, 3], [10, 20, 30], [100, 200, 300]]
>>> [sum(a) for a in zip(*array)]
[111, 222, 333]

答案 1 :(得分:2)

听起来您可能正在处理时间序列数据,其中包含一个包含每小时值的文件,您需要每日总和(因此24)。熊猫图书馆可以很好地完成这个任务:

假设您的数据位于data.csv

import pandas
df = pandas.read_csv('data.csv')

如果您的某个列是时间戳,您可以使用它,但如果您只有原始数据,则可以创建时间索引:

df.index = pandas.date_range(pandas.datetime.today().date(), 
                             periods=df.shape[0], freq='H')

现在每天对所有列的总结非常简单:

daily = df.resample('D').apply(sum)

答案 2 :(得分:1)

请试试这个:

x = len(a) # x is the length of a

step = 24

# get the number of iterations you need to do
n = int(math.ceil(float(x) / step))


new_a = [map(lambda k: sum(list(k)), zip(*a[i * step:(i + 1) * step])) 
         for i in range(0, n)]

如果x不是24的倍数,那么new_a中的最后一行将包含剩余行数(其数量将小于24)。

这也假设a中的值是数字,所以我没有进行任何转换。