2014-12-03 58 views
1

我有數據(大約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的位置)。

有什麼想法? 特別是我如何可以輕鬆地建立一個給定列表的元組數組?

+0

作爲一個額外的問題,我不是真正做算術時我聚集,我在做自定義函數,需要一次所有的數字(按行,然後列不工作) – CastleH 2014-12-04 09:13:09

+0

我認爲我需要做的是: 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

回答

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 2014-12-03 20:32:57

+0

有用的信息謝謝,不幸的是我的問題需要同時聚合行和列。請參閱編輯問題。 – CastleH 2014-12-04 10:01:31