2014-12-03 3 views
1

У меня есть квадратный массив/матрица данных (примерно 2000 строк и столбцов) , и я хочу, чтобы объединить его в меньший массив (около 1000 строк и столбцов)питона Совокупный (GroupBy) 2d-матрица

I есть список main_ids, который соответствует строкам/столбцам в массиве orriginal. , например. new_ids = [0,0,0,1,1,2, ...] отправит агрегировать первые 3 строки/столбцы в новую строку/столбец 1, а затем 4-я, 5-я строка/столбец, агрегированные со вторым и так далее на ...

до сих пор я следующий код, но я хотел бы optomize, если это возможно

import numpy as np 
new_ids = np.array(new_ids) 
unew_ids = unique(new_ids) 
unew_ids.sort() 

#Collapse rows 
rowMat = np.zeros([len(new_ids),len(unew_ids)], dtype=np.float64) 

for i in range(0,len(mat[0])): 
    for j in range(0, len(unew_ids)): 
     rowMat[i,j] = np.sum(mat[i][new_ids == unew_ids[j]]) 

#Collapse columns 
outMat = np.zeros([len(unew_ids),len(unew_ids)], dtype=np.float64) 

for i in range(0, len(unew_ids)): 
    for j in range(0, len(unew_ids)): 
     outMat[j,i] = np.sum(rowMat[:,i][new_ids == unew_ids[j]]) 

return outMat 

Я пытался экспериментировать с matplotlib.mlab.rec_groupby, однако для этого мне нужно (или я думаю, мне нужно) для создания нового массива (new_ids, row), где row - это массив numpy с строкой из исходной матрицы, однако это, похоже, не работает.

[Edit:]

В качестве дополнительной задачи, я на самом деле не делает сумму, когда я агрегировать, я делаю пользовательскую функцию, которая должна все номера одновременно (делая его по строкам, а затем столбцы не работает)

{примерно - My_function = (взять сумму элементов, если таковые были отрицательными удалить те из суммы, а затем mulitply все это на 1/(1 + сумма отрицательных элементов))}

Я думаю, что мне нужно сделать:

outputmat = [ [my_function(input_mat[new_ids_arr == tuple])] for tuple in unique_arr.ravel()] 

outputmat = np.array(outputmat) 
outputmat.reshape(something) 

где new_ids_arr - это массив формы [[(10,10), (10,10), ...] [(10,10), (10,10), (10,12), .. .], ...] - т.е. кортежи, где все происходит после агрегации. Я надеюсь, что могу найти funciton (или построить один), который делает new_ids_arr = new_ids * new_ids^Transpose ... или аналогичный

unique_arr = - это массив того же размера/формы, что и вывод, и с каждым элемент, содержащий кортеж (например, unique_arr [0,0] = (10,10) meaing, поместите все элементы input_matrix, где в месте, помеченном как 10,10 в это место).

Любые мысли? В частности, как я мог легко построить массив кортежей с учетом списка?

+0

В качестве дополнительной задачи, я на самом деле не делает сумму, когда я агрегировать, я делаю пользовательская функция, которая требует всех номеров сразу (это делается по строкам, а затем столбцы не работают) – CastleH

+0

Я думаю, что мне нужно сделать следующее: from the new_ids - создать «матрицу», где каждый элемент является кортежем местоположение, где будет осуществляться агрегация. , например. new_ids = [10,10,12,5,5, ..] then new_ids_mat = [[(10,10), (10,10), ....], [(10,10), (12,10)), ....] ..] Я хочу new_ids_mat = (new_ids * new_ids^T) или что-то ... надеюсь, есть функция, которую я могу использовать .. тогда я делаю то же самое со своим списком unique_new_ids - [[10,10), (10,5), ...]]. Тогда что-то вроде unique_new_ids_r = unique_new_ids.ravel() output = [[my_func (input_mat [new_ids_mat [tuple]])] для tuple in unique_new_ids_r] звук правый? – CastleH

ответ

2

Если вы можете конвертировать ваши new_ids к чему-то вроде [0,3,5,...] тогда вы могли бы попробовать что-то вроде этого:

import numpy as np 
np.random.seed(0) 
arr = np.random.rand(20,20) 

rowidx = np.array([0, 3, 9, 12, 18], dtype=np.int32) 
colidx = np.array([0, 5, 10, 15], dtype=np.int32) 

#Collapse rows 
step1 = np.add.reduceat(arr, rowidx, axis=0) 

#Collapse columns 
step2 = np.add.reduceat(step1, colidx, axis=1) 
+0

Спасибо, Я не уверен, могу ли я уменьшить свои new_ids до набора срезов или нет. Может быть. У меня будет игра – CastleH

+0

Полезная информация спасибо, к сожалению моя проблема требует одновременного объединения строк и столбцов. См. Редактирование вопроса. – CastleH