假设我有以下列表的列表:
我希望能够计算数组中每个第n个元素的平均值,但是当我试图用简单的方法实现时,由于不同长度而导致Python生成越界错误。为了解决这个问题,我给每个数组赋予最长数组的长度,并使用None填充缺失值。
不幸的是,这样做使得计算平均值变得不可能,因此我将数组转换为掩码数组。下面展示的代码可以工作,但似乎相当繁琐。
有没有更快的方法来完成这个任务?最终的列表将包含600000个“行”和多达100个“列”,因此效率非常重要:-)。
a = [
[1, 2, 3],
[2, 3, 4],
[3, 4, 5, 6]
]
我希望能够计算数组中每个第n个元素的平均值,但是当我试图用简单的方法实现时,由于不同长度而导致Python生成越界错误。为了解决这个问题,我给每个数组赋予最长数组的长度,并使用None填充缺失值。
不幸的是,这样做使得计算平均值变得不可能,因此我将数组转换为掩码数组。下面展示的代码可以工作,但似乎相当繁琐。
import numpy as np
import numpy.ma as ma
a = [ [1, 2, 3],
[2, 3, 4],
[3, 4, 5, 6] ]
# Determine the length of the longest list
lenlist = []
for i in a:
lenlist.append(len(i))
max = np.amax(lenlist)
# Fill each list up with None's until required length is reached
for i in a:
if len(i) <= max:
for j in range(max - len(i)):
i.append(None)
# Fill temp_array up with the n-th element
# and add it to temp_array
temp_list = []
masked_arrays = []
for j in range(max):
for i in range(len(a)):
temp_list.append(a[i][j])
masked_arrays.append(ma.masked_values(temp_list, None))
del temp_list[:]
# Compute the average of each array
avg_array = []
for i in masked_arrays:
avg_array.append(np.ma.average(i))
print avg_array
有没有更快的方法来完成这个任务?最终的列表将包含600000个“行”和多达100个“列”,因此效率非常重要:-)。
izip_longest
在 Python 3 中更名为zip_longest
。 - ihavenoidea