如何将列表拆分为生存,然后在 python 中对其进行平均?
How to split list into subsist and then average it in python?
我写了下面的代码,它需要 10 个样本,然后将其分成两个列表,然后对其进行平均,即在输出中我有 5 个数据样本。
av = 2
data = np.random.randn(10);
print(data)
tic = time.time();
def average(av_n, data):
if av_n > 1:
data = data[:len(data) - len(data) % av_n];
llen = len(data)
avedDataLen = int(llen/av_n);
chunks = [data[x:x+avedDataLen] for x in xrange(0, llen, avedDataLen)]
print (chunks)
def divide(x): return (x / av_n)
return map(divide, map(sum, zip(*chunks)))
else:
return data
amp = np.asarray(average(av, data))
print(amp)
print ('takes time: ' +str(time.time() - tic))
例如我的输入是:
[-0.22609503 -0.4501512 -0.46334891 1.18450149 -1.17728558 1.27805933
0.25943615 -1.18671214 0.96818224 0.32928086]
它应该被分成 'av_n' 个数组,在这种情况下它是两个:
[-0.22609503, -0.4501512 , -0.46334891, 1.18450149, -1.17728558]
[ 1.27805933, 0.25943615, -1.18671214, 0.96818224, 0.32928086]
输出是:
[ 0.52598215 -0.09535753 -0.82503053 1.07634186 -0.42400236]
唯一的问题是我的应用程序平均需要花费 0.25 秒的时间,有没有更快的方法?
如果 data
可以均匀地分成所需数量的子列表,您可以 reshape
数组,然后使用 np.average
和适当的 axis
参数。
>>> data
array([-0.22609503, -0.4501512 , -0.46334891, 1.18450149, -1.17728558,
1.27805933, 0.25943615, -1.18671214, 0.96818224, 0.32928086])
>>> np.average(data.reshape((2, -1)), axis=0)
array([ 0.52598215, -0.09535752, -0.82503053, 1.07634186, -0.42400236])
>>> np.average(data.reshape((2, -1)), axis=1)
array([-0.22647585, 0.32964929])
如果列表不能被整除,你可以trim最后几个元素;你似乎也在你的代码中做了类似的事情。结果是一样的,而且速度要快得多。
>>> data = np.random.randn(127874)
>>> %timeit np.asarray(list(average(2, data)))
10 loops, best of 3: 36.8 ms per loop
>>> %timeit np.average(data.reshape((2, len(data)//2)), axis=0)
10000 loops, best of 3: 115 µs per loop
(由于 Python 2 与 3 中 map
的不同行为,使用 list(average(...))
;请注意,您的代码创建了大量临时列表,包括由map
.)
我写了下面的代码,它需要 10 个样本,然后将其分成两个列表,然后对其进行平均,即在输出中我有 5 个数据样本。
av = 2
data = np.random.randn(10);
print(data)
tic = time.time();
def average(av_n, data):
if av_n > 1:
data = data[:len(data) - len(data) % av_n];
llen = len(data)
avedDataLen = int(llen/av_n);
chunks = [data[x:x+avedDataLen] for x in xrange(0, llen, avedDataLen)]
print (chunks)
def divide(x): return (x / av_n)
return map(divide, map(sum, zip(*chunks)))
else:
return data
amp = np.asarray(average(av, data))
print(amp)
print ('takes time: ' +str(time.time() - tic))
例如我的输入是:
[-0.22609503 -0.4501512 -0.46334891 1.18450149 -1.17728558 1.27805933
0.25943615 -1.18671214 0.96818224 0.32928086]
它应该被分成 'av_n' 个数组,在这种情况下它是两个:
[-0.22609503, -0.4501512 , -0.46334891, 1.18450149, -1.17728558]
[ 1.27805933, 0.25943615, -1.18671214, 0.96818224, 0.32928086]
输出是:
[ 0.52598215 -0.09535753 -0.82503053 1.07634186 -0.42400236]
唯一的问题是我的应用程序平均需要花费 0.25 秒的时间,有没有更快的方法?
如果 data
可以均匀地分成所需数量的子列表,您可以 reshape
数组,然后使用 np.average
和适当的 axis
参数。
>>> data
array([-0.22609503, -0.4501512 , -0.46334891, 1.18450149, -1.17728558,
1.27805933, 0.25943615, -1.18671214, 0.96818224, 0.32928086])
>>> np.average(data.reshape((2, -1)), axis=0)
array([ 0.52598215, -0.09535752, -0.82503053, 1.07634186, -0.42400236])
>>> np.average(data.reshape((2, -1)), axis=1)
array([-0.22647585, 0.32964929])
如果列表不能被整除,你可以trim最后几个元素;你似乎也在你的代码中做了类似的事情。结果是一样的,而且速度要快得多。
>>> data = np.random.randn(127874)
>>> %timeit np.asarray(list(average(2, data)))
10 loops, best of 3: 36.8 ms per loop
>>> %timeit np.average(data.reshape((2, len(data)//2)), axis=0)
10000 loops, best of 3: 115 µs per loop
(由于 Python 2 与 3 中 map
的不同行为,使用 list(average(...))
;请注意,您的代码创建了大量临时列表,包括由map
.)