是否有任何巨无意思的方法来查找阵列中特定元组元素的平均值?

共8个回答,已解决, 标签: python arrays python-3.x tuples average

我想把这个代码写成巨蟒。我的真实数组比这个例子大得多。

(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]))

如何避免这种情况?我想用第二个例子。

第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 设置为 float0.0 。但是, 这也意味着我们必须使生成器表达式显式括号, 否则它是语法错误, 它不太漂亮, 如注释中所述:

average = sum((value[1] for value in array), 0.0) / len(array)

它可能是最好使用 fsummath 模块, 这将返回 float :

from math import fsum

average = fsum(value[1] for value in array) / len(array)
第2个答案

如果确实要使用 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 。在这种情况下, 您可以使用 floatint , 它没有区别。

第3个答案

使用纯 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()
第4个答案

您只需使用:

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))
第5个答案

如果你对更多的高尔夫样解决方案持开放态度, 你可以将你的阵列与香草巨蟒相关联, 得到一个只有数字的列表, 并计算用

sum(zip(*array)[1])/len(array)
第6个答案

你可以使用 map 而不是列表理解

sum(map(lambda x:int(x[1]), array)) / len(array)

functools.reduce (如果您使用 python2. x 只是 reducefunctools.reduce )

import functools
functools.reduce(lambda acc, y: acc + y[1], array, 0) / len(array)
第7个答案

您可以使用 map :

np.mean(list(map(lambda x: x[1], array)))

第8个答案

只需使用列表中元素的总和和数量来查找平均值。

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

相关问题

通过随机抽样其他列数据创建新列 如何使用熊猫获得包括每一个组合的计数 如何有效地展开矩阵的值与小块? "注意: 未定义的变量"、"注意: 未定义的索引" 和 "注意: 未定义的偏移量" 使用 PHP 删除数字数组中的所有重复数字 [重复] 使用数组中的键获取最小值 是否有任何巨无意思的方法来查找阵列中特定元组元素的平均值? 如何在元素列表中找到最大的数字, 可能不是唯一的? 如何以 Pythonic 的方式向上移动 n 个目录? 从对创建元组 为什么 splatting 在 rhs 上创建一个元组,但在 lhs 上创建一个列表?