我想将此代码编写为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
答案 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
的起始值设置为float
值0.0
。但是,这也意味着我们必须用括号使生成器表达式显式,否则这是一个语法错误,而且不那么漂亮,如注释中所述:
average = sum((value[1] for value in array), 0.0) / len(array)
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
。在这种情况下,您可以使用float
或int
,这没有什么区别。
答案 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