我有一个方形数组/矩阵数据(大约2000行和列) 我想把它聚合成一个更小的数组(大约1000行和列)
我有一个main_ids列表,它对应于orriginal数组中的行/列。 例如new_ids = [0,0,0,1,1,2,...]将聚合前3行/列到新行/列1,然后第4,第5行/列聚合到第2行,所以上...
到目前为止,我有以下代码,但我想在可能的情况下进行优化
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数组,带有来自orriginal矩阵的一行但是,这似乎不起作用。
[编辑:]
作为一个额外的问题,当我汇总时,我实际上并没有做总和,我正在做一个需要一次性所有数字的自定义函数(按行进行,然后列不是'工作)
{rough - my_function =(取元素之和,如果有任何负数,则从总和中除去那些,然后将整个事物多于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 ^ Transpose ...或类似的功能(或构建一个)
unique_arr =是一个与输出大小/形状相同的数组,并且每个元素都包含一个元组(例如unique_arr [0,0] =(10,10)meaing将所有input_matrix元素放在一个位置标记为10,10进入此位置。)
有什么想法? 特别是如何在列表中轻松构建元组数组?
答案 0 :(得分: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)