Промежуточные итоги в NumPy - PullRequest
2 голосов
/ 03 июня 2011

У меня есть пустой массив:

[[1 3 1]
 [8 9 0]
 [1 3 1]
 [8 4 1]
 [5 1 0]]

, и я хочу создать промежуточные итоги (количество, суммы, средние значения) для столбцов 0,1 для каждого из значений 3-го столбца.Это может быть сделано непосредственно в NumPy или я должен зациклить весь массив?

Ответы [ 4 ]

3 голосов
/ 03 июня 2011

Это можно сделать с помощью панд (http://pandas.sourceforge.net/)

In [35]: from pandas import DataMatrix

In [36]: dm = DataMatrix(a)

In [37]: dm
Out[37]: 
     0           1           2           
0    1           3           1          
1    8           9           0          
2    1           3           1          
3    8           4           1          
4    5           1           0          

In [38]: dm.groupby(dm[2]).sum()
Out[38]: 
     0           1           2           
0    13          10          0          
1    10          10          3          


In [39]: dm.groupby(dm[2]).mean()
Out[39]: 
     0           1           2           
0    6.5         5           0          
1    3.333       3.333       1          

In [48]: dm[2].groupby(dm[2]).agg(len)
Out[48]: 
0    2
1    3

Но это может быть немного излишним =) (подробнее о групповом: http://pandas.sourceforge.net/groupby.html)

3 голосов
/ 03 июня 2011

Если у вас мало значений в третьем столбце, вы можете сделать это так для каждого значения (предполагается, что ваш массив data):

np.mean(data[data[:,2] == 1], axis = 0)
np.sum(data[data[:,2] == 1], axis = 0)

В противном случае вы можете выполнить цикл для различных значений в третьем столбце.

2 голосов
/ 03 июня 2011

Вы можете использовать numpy.histogram():

counts = numpy.histogram(data[:,2], bins=range(3))[0]
sums0 = numpy.histogram(data[:,2], bins=range(3), weights=data[:,0])[0]
sums1 = numpy.histogram(data[:,2], bins=range(3), weights=data[:,1])[0]

bins должны быть адаптированы для отображения значений в третьем столбце.

0 голосов
/ 19 февраля 2014

Сначала вычислите разницу между вашими элементами и последним столбцом:

check = data[:,:2]-data[:,2].reshape((-1,1))

Затем вы можете суммировать элементы проверки, равные нулю, в каждой строке

sum(check==0, axis=1)

Возвращает массив длины «количество строк» ​​с количеством вхождений значения последнего столбца в первых двух столбцах.

Однако то, что вы хотите, мне не совсем понятно.

Если вы просто хотите суммировать и усреднять данные, методы sum, mean и std на ndarrays позволяют делать это «по оси»:

data[:,:2].mean(axis=1)
data[:,:2].sum(axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...