这是一种基于Szabolcs帖子的方法,速度大约快一个数量级。
data = RandomReal[5, {500000, 3}];(*500k values*)zvalues = data[[All, 3]];epsilon = 1*^-10;(*prevent 101 index*)(*rescale and round (x,y) coordinates to index pairs in the 1..100 range*)indexes = 1 + Floor[(1 - epsilon) 100 Rescale[data[[All, {1, 2}]]]];res2 = Module[{gb = GatherBy[Transpose[{indexes, zvalues}], First]}, SparseArray[ gb[[All, 1, 1]] -> Total[gb[[All, All, 2]], {2}]]]; // AbsoluteTiming
给出{2.012217,Null}
AbsoluteTiming[ System`SetSystemOptions[ "SparseArrayOptions" -> {"TreatRepeatedEntries" -> 1}]; res3 = SparseArray[indexes -> zvalues]; System`SetSystemOptions[ "SparseArrayOptions" -> {"TreatRepeatedEntries" -> 0}]; ]
给出{0.195228,空}
res3 == res2True
“ TreatRepeatedEntries”-> 1将重复的位置加起来。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)