我有數據(大約2000行和列) 的正方形陣列/矩陣,我想它聚合成更小的陣列(大致1000行和列)蟒骨料(GROUPBY)2D矩陣
我有一個main_ids列表,它對應於原始數組中的行/列。 例如new_ids = [0,0,0,1,1,2,...]會將前3行/列彙總到新行/列1,然後將第4,5行/列彙總到第2行上...
到目前爲止,我已經在for我需要下面的代碼,但我想它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數組,其中有一行來自原始矩陣,但這似乎不起作用。
[編輯:]
作爲一個額外的問題,我沒有真正做的時候我聚集的總和,我做了所有需要的數字自定義函數一次(按行,然後做列是不工作)
{大致 - 創建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),... 。],...] - 即所有事物聚集後的元組。 我希望我能找到一個功能可按(或建立的),做new_ids_arr = new_ids * new_ids ^移調...或類似
unique_arr =是相同的大小/形狀作爲輸出的陣列,以及與每個包含元組的元素(例如unique_arr [0,0] =(10,10)meaing將所有input_matrix元素放置在標記爲10,10的位置)。
有什麼想法? 特別是我如何可以輕鬆地建立一個給定列表的元組數組?
作爲一個額外的問題,我不是真正做算術時我聚集,我在做自定義函數,需要一次所有的數字(按行,然後列不工作) – CastleH 2014-12-04 09:13:09
我認爲我需要做的是: from 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]])]爲unique_new_ids_r中的元組] sound right? – CastleH 2014-12-04 09:46:46