蟒骨料(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的位置)。
有什么想法? 特别是我如何可以轻松地建立一个给定列表的元组数组?
如果您可以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)
作为一个额外的问题,我不是真正做算术时我聚集,我在做自定义函数,需要一次所有的数字(按行,然后列不工作) – 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