Среднее элементов в подмассиве - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть массив как a=[1, 2, 3, 4, 5, 6, 7]. Я хочу разделить этот массив на 3 части любого размера.

Когда я делю это на 3 порции, я получаю 3 подмассива: [array([1, 2, 3]), array([4, 5]), array([6, 7])].

Моя цель - получить массив со средним значением элементов в подмассиве: [2, 4.5, 6.5], так как (1+2+3)/3=2 (первый элемент), (4+5)/2=4.5 (второй элемент) и т. Д.

Я попробовал следующий код:

import numpy as np
a=[1, 2, 3, 4, 5, 6, 7]
a_split=np.array_split(a, 3)
a_split_avg=np.mean(a_split, axis=1)

Я получаю следующую ошибку: tuple index out of range.

Ответы [ 4 ]

0 голосов
/ 06 ноября 2018

Вот векторизованное решение, которое позволяет избежать шага разделения для повышения производительности и напрямую получает сгруппированные суммы и, следовательно, средние значения -

def average_groups(a, N): # N is number of groups and a is input array
    n = len(a)
    m = n//N
    w = np.full(N,m)
    w[:n-m*N] += 1
    sums = np.add.reduceat(a, np.r_[0,w.cumsum()[:-1]])
    return np.true_divide(sums,w)

Пробный прогон -

In [357]: a=[1, 2, 3, 4, 5, 6, 7]

In [358]: average_groups(a, N=3)
Out[358]: array([2. , 4.5, 6.5])
0 голосов
/ 06 ноября 2018

Вы получаете сообщение об ошибке, потому что np.array_split возвращает список массивов numpy, а не многомерный массив numpy, поэтому axis не будет работать с ним. Заменить последнюю строку на это:

a_split_avg = [np.mean(arr) for arr in a_split]
0 голосов
/ 06 ноября 2018

Вы можете использовать np.vectorize в своих вычислениях, чтобы применить функцию mean к каждому элементу в списке массивов:

means = np.vectorize(np.mean)(a_split)

Результатом является список со средним значением для каждого создаваемого вами подмассива.

0 голосов
/ 06 ноября 2018

Попробуйте это:

In [1224]: mean_arr = []
In [1225]: for i in a_split:
      ...:     mean_arr.append(np.mean(i))

In [1226]: 

In [1226]: mean_arr
Out[1226]: [2.0, 4.5, 6.5]
...