Python numy усреднение - PullRequest
       17

Python numy усреднение

2 голосов
/ 12 ноября 2011

Усреднение таблицы как это не проблема

table = [[1,2,3,0],[1,2,3,0],[1,2,3,4]]

Вы можете

print numpy.average(table,axis=0)

Но что, если у меня есть неровные последовательности вроде:

table = [[1,2,3],[1,2,3],[1,2,3,4]]

Тогда результат должен быть:

1,2,3,4

Поскольку элемент, содержащий число 4, встречается только один раз. и 4/1 = 4. Но NumPy не позволит этого.

ValueError: установка элемента массива с последовательностью.

Ответы [ 2 ]

3 голосов
/ 12 ноября 2011

Вы можете подать данные в массив с масками, а затем вычислить средние значения с помощью np.ma.mean:

import numpy as np
import itertools
data=[[1,2,3],[1,2,3],[1,2,3,4]]

rows=len(data)
cols=max(len(row) for row in data)
arr=np.ma.zeros((rows,cols))
arr.mask=True
for i,row in enumerate(data):
    arr[i,:len(row)]=row

print(arr.mean(axis=0))

выходы

[1.0 2.0 3.0 4.0]

Элементы массива становятся без масок (т.е. arr.mask[i,j]=False), когда присваивается значение. Обратите внимание на результирующую маску ниже:

In [162]: arr
Out[162]: 
masked_array(data =
 [[1.0 2.0 3.0 --]
 [1.0 2.0 3.0 --]
 [1.0 2.0 3.0 4.0]],
             mask =
 [[False False False  True]
 [False False False  True]
 [False False False False]],
       fill_value = 1e+20)

Если ваши данные довольно короткие, метод yosukesabai или чисто Python-решение, вероятно, будет быстрее, чем то, что я показываю выше. Инвестируйте в создание массива с маской только в том случае, если данные очень велики, и у вас достаточно простых операций с массивом для первоначальной стоимости установки массива.

2 голосов
/ 12 ноября 2011

Единственный обходной путь, о котором я могу подумать, - это использовать itertools и временный список, не очень красивый.

import numpy as np
from itertools import izip_longest
table = [[1,2,3],[1,2,3],[1,2,3,4]]

for row in izip_longest(*table):
    print np.average([x for x in row if x is not None])

Это дает

1.0
2.0
3.0
4.0
...