蟒骨料(GROUPBY)2D矩阵

问题描述:

我有数据(大约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

如果您可以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