有什么pythonic方法可以找到数组中特定元组元素的平均值?

时间:2019-04-25 07:05:23

标签: python arrays python-3.x tuples average

我想将此代码编写为pythonic。我的实际数组比此示例大得多。

(5 + 10 + 20 + 3 + 2)/ 5

  

print(np.mean(array,key = lambda x:x [1]))   TypeError:mean()得到了意外的关键字参数'key'

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.7

9 个答案:

答案 0 :(得分:24)

如果您使用的是Python 3.4或更高版本,则可以使用statistics模块:

from statistics import mean

average = mean(value[1] for value in array)

或者如果您使用的Python版本早于3.4:

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

这些解决方案都使用Python的一个不错的功能,称为生成器表达式。循环

value[1] for value in array

以及时且高效的内存创建方式创建新序列。参见PEP 289 -- Generator Expressions

如果您使用的是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)

最好使用fsum模块中的math,它将返回一个float

from math import fsum

average = fsum(value[1] for value in array) / len(array)

答案 1 :(得分:3)

如果确实要使用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,这没有什么区别。

答案 2 :(得分:2)

您可以简单地使用:

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

答案 3 :(得分:2)

使用纯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 :(得分:2)

如果您愿意接受更多类似高尔夫的解决方案,则可以使用香草python转置数组,获取仅包含数字的列表,然后使用

计算平均值
@foreach($permissions as $key => $value)
    <option name="permissions[]" {{ in_array($key +1, $role->permission()->pluck('id')->toArray()) ? 'selected' : '' }} value="{{$value->id}}">{{ $value->name }}</option>
@endforeach

答案 5 :(得分:1)

您可以使用 return_status := 1; RETURN (return_status); 代替列表理解

map

sum(map(lambda x:int(x[1]), array)) / len(array) (如果您使用Python2.X,只需functools.reduce而不是reduce

functools.reduce

答案 6 :(得分:0)

您可以使用map

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

答案 7 :(得分:0)

只需使用列表中元素的总和和数量即可得出平均值。

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

答案 8 :(得分:0)

这里的问题是您不能直接将元组列表的平均值计算为ndarray,因为所有值都将强制转换为str

但是,要解决这个问题的方法是从元组列表中定义一个structured array,以便您可以将不同的数据类型与元组中的每个元素相关联。

因此,您可以使用以下命令从元组列表中定义结构化数组:

l = [('a', 5) , ('b', 10), ('c', 20), ('d', 3), ('e', 2)]
a = np.array(l, dtype=([('str', '<U1'), ('num', '<i4')]))

然后简单地取数字字段的np.mean,即元组中的第二个元素:

np.mean(a['num'])
# 8.0