我仍然在调整编写代码的“更多pythonian方式”时遇到麻烦...现在我正在迭代一些值(x)。我有很多数组,我总是比较所有数组的第一个值,第二个值......很快:数组中所有条目的平均值按数组中的位置。
sum_mean_x = []
for i in range(0, int_points):
for j in range(0, len(x)):
mean_x.append(x[j][i])
sum_mean_x.append(sum(mean_x)/len(x))
mean_x = []
我很确定可以做得超级漂亮。我知道我可以将第二行改为sum_mean_x.append(mean_x.mean)
,但我想我会错过一些严肃的魔法。
答案 0 :(得分:6)
使用numpy包进行数字处理。假设您在普通Python中有以下三个列表:
a1 = [1., 4., 6.]
a2 = [3., 7., 3.]
a3 = [2., 0., -1.]
并且您希望获得每个职位的平均值。将向量排列在一个数组中:
import numpy as np
a = np.array([a1, a2, a3])
然后你可以像这样得到每列的意思:
>>> a.mean(axis=0)
array([ 2. , 3.66666667, 2.66666667])
答案 1 :(得分:3)
听起来你要做的就是将列表列表视为一个二维数组,其中每个列表都是一行,然后对每列进行平均。
显而易见的方法是使用NumPy,使其成为一个真正的2D数组,然后按列调用mean
。请参阅simleo's answer,这比我在此处添加的要好。 :)
但是如果你想坚持使用列表列表,那么有效地按列进行转置就意味着zip
:
>>> from statistics import mean
>>> arrs = [[1., 2., 3.], [0., 0., 0.], [2., 4., 6.]]
>>> column_means = [mean(col) for col in zip(*arrs)]
>>> column_means
[1.0, 2.0, 3.0]
statistics.mean
仅在3.4+中的stdlib中,但它基于PyPI上的stats
,如果你的Python太老了,你可以自己编写它。在边缘情况下正确处理错误是很棘手的,因此您可能希望查看来自statistics
的代码,但如果您只处理接近1的值,则可以以明显的方式执行:< / p>
def mean(iterable):
total, length = 0.0, 0
for value in iterable:
total += value
length += 1
return total / length
答案 2 :(得分:0)
ar1 = [1,2,3,4,5,6]
ar2 = [3,5,7,2,5,7]
means = [ (i+j)/2.0 for (i,j) in zip(ar1, ar2)]
print(means)
答案 3 :(得分:-1)
你的意思是
import numpy as np
ar1 = [1,2,3,4,5,6]
ar2 = [3,5,7,2,5,7]
mean_list = []
for i, j in zip(ar1, ar2):
mean_list.append(np.array([i,j]).mean())
print(mean_list)
[2.0, 3.5, 5.0, 3.0, 5.0, 6.5]