У меня есть квадратный массив/матрица данных (примерно 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 в это место).
Любые мысли? В частности, как я мог легко построить массив кортежей с учетом списка?
В качестве дополнительной задачи, я на самом деле не делает сумму, когда я агрегировать, я делаю пользовательская функция, которая требует всех номеров сразу (это делается по строкам, а затем столбцы не работают) – CastleH
Я думаю, что мне нужно сделать следующее: 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