我想把这个代码写成巨蟒。我的真实数组比这个例子大得多。
(5 + 10 + 20 + 3 + 2)/5
打印 (np. 平均值 (数组, key = lambda x:x[1])) TypeError: 平均值 () 得到了一个意外的关键字参数 "键"
array = [('a', 5) , ('b', 10), ('c', 20), ('d', 3), ('e', 2)]
sum = 0
for i in range(len(array)):
sum = sum + array[i][1]
average = sum / len(array)
print(average)
import numpy as np
print(np.mean(array,key=lambda x:x[1]))
如何避免这种情况?我想用第二个例子。
如果您使用的是 python 3.4 或更高版本, 则 statistics
可以使用该模块:
from statistics import mean
average = mean(value[1] for value in array)
或者, 如果您使用的是一个旧于 3.4 的 Python 版本:
average = sum(value[1] for value in array) / len(array)
这些解决方案都使用了一个很好的 Python 功能, 称为生成器表达式。循环
value[1] for value in array
以及时和内存高效的方式创建新序列。见pep 289----生成器表达式。
如果您使用的是 Python 2, 并且您正在求和整数, 我们将有整数除法, 这将截断结果, 例如:
>>> 25 / 4
6
>>> 25 / float(4)
6.25
为了确保我们没有整数除法, 我们可以将起始值 sum
设置为 float
值 0.0
。但是, 这也意味着我们必须使生成器表达式显式括号, 否则它是语法错误, 它不太漂亮, 如注释中所述:
average = sum((value[1] for value in array), 0.0) / len(array)
它可能是最好使用 fsum
的 math
模块, 这将返回 float
:
from math import fsum
average = fsum(value[1] for value in array) / len(array)
如果确实要使用 numpy
, 请将其转换为一个 numpy.array
, 并选择要使用索引的轴 numpy
:
import numpy as np
array = np.array([('a', 5) , ('b', 10), ('c', 20), ('d', 3), ('e', 2)])
print(array[:,1].astype(float).mean())
# 8.0
由于原始数组同时包含字符串和数字, 因此具有类型, 因此需要强制转换为数字类型 object
。在这种情况下, 您可以使用 float
或 int
, 它没有区别。
使用纯 Python:
from operator import itemgetter
acc = 0
count = 0
for value in map(itemgetter(1), array):
acc += value
count += 1
mean = acc / count
如果您的数据不能作为一个内存 ( list
因为您说它很大), 迭代方法可能是可取的。如果可以, 则首选声明性方法:
data = [sub[1] for sub in array]
mean = sum(data) / len(data)
如果你愿意使用 numpy
, 我发现这个清洁剂:
a = np.array(array)
mean = a[:, 1].astype(int).mean()
您只需使用:
print(sum(tup[1] for tup in array) / len(array))
或者对于 Python 2:
print(sum(tup[1] for tup in array) / float(len(array)))
或者更简洁地对于 Python 2:
from math import fsum
print(fsum(tup[1] for tup in array) / len(array))
如果你对更多的高尔夫样解决方案持开放态度, 你可以将你的阵列与香草巨蟒相关联, 得到一个只有数字的列表, 并计算用
sum(zip(*array)[1])/len(array)
你可以使用 map
而不是列表理解
sum(map(lambda x:int(x[1]), array)) / len(array)
或 functools.reduce
(如果您使用 python2. x 只是 reduce
不 functools.reduce
)
import functools
functools.reduce(lambda acc, y: acc + y[1], array, 0) / len(array)
您可以使用 map
:
np.mean(list(map(lambda x: x[1], array)))
只需使用列表中元素的总和和数量来查找平均值。
array = [('a', 5) , ('b', 10), ('c', 20), ('d', 3), ('e', 2)]
avg = float(sum(value[1] for value in array)) / float(len(array))
print(avg)
#8.0