我有一个维度为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循环来实现它。这两种声音都不是那么优雅。
答案 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
中的值是数字,所以我没有进行任何转换。