Как разбить список на subsist и затем усреднить его в python? - PullRequest
0 голосов
/ 25 февраля 2019

Я написал следующий код, который берет 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 секунды, есть ли более быстрый способ сделать это?

1 Ответ

0 голосов
/ 25 февраля 2019

При условии, что 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])

Еслисписок не делится поровну, вы можете обрезать последние несколько элементов;кажется, вы делаете что-то подобное и в своем коде.Результат тот же, и он значительно быстрее.

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

(Использование list(average(...)) из-за разного поведения map в Python 2 по сравнению с 3; обратите внимание, что ваш код создает многовременные списки, в том числе созданные map.)

...