我有一个numpy数组列表。我想计算这些数组中的平均值。 例如:
import numpy as np
arrays = [np.random.random((4,2)) for _ in range(3)]
如何获得此数组中元素的平均值?
这就是我希望结果具有形状(4,2)
,其中每个元素是列表中数组的相应索引的平均值。
我知道我可以写一个for循环来实现这个目标,但应该有一个更好的numpy方式。
答案 0 :(得分:2)
使用np.mean
的功能形式:
>>> import numpy as np
>>> arrays = [np.random.random((4,2)) for _ in range(3)]
>>> np.mean(arrays, axis=0)
这会将您的数组列表转换为形状为(3, 4, 2)
的3D数组,然后沿轴0
取平均值。
您也可以使用Python的sum
:
>>> sum(arrays)/len(arrays)
对于像你的例子这样的小清单,这实际上更快。
某些时间安排(m
是列表的长度):
m: 3 n:4 k: 2
numpy 0.01291340 ms
python 0.00295936 ms
m: 10 n:100 k: 100
numpy 0.14189354 ms
python 0.09465128 ms
m: 1000 n:10 k: 10
numpy 0.43023768 ms
python 0.45201713 ms
基准代码:
import numpy as np
from timeit import timeit
import types
def setup(m, n, k):
return list(np.random.random((m, n, k)))
def f_numpy(a):
return np.mean(a, axis=0)
def f_python(a):
return sum(a)/len(a)
for args in [(3, 4, 2), (10, 100, 100), (1000, 10, 10)]:
data = setup(*args)
print('m: {} n:{} k: {}'.format(*args))
for name, func in list(globals().items()):
if not name.startswith('f_') or not isinstance(func, types.FunctionType):
continue
print("{:16s}{:16.8f} ms".format(name[2:], timeit(
'f(data)', globals={'f':func, 'data':data}, number=1000)))
答案 1 :(得分:0)
numpy nanmean
将确保即使数据中存在某些缺失值也能正常工作:
np.nanmean(arrays, axis=0)