【发布时间】:2011-11-24 04:49:16
【问题描述】:
给定两个相同长度的无序数组 a 和 b:
a = [7,3,5,7,5,7]
b = [0.2,0.1,0.3,0.1,0.1,0.2]
我想按 a 中的元素分组:
aResult = [7,3,5]
对 b 中的元素求和(用于总结概率密度函数的示例):
bResult = [0.2 + 0.1 + 0.2, 0.1, 0.3 + 0.1] = [0.5, 0.1, 0.4]
或者,在 python 中随机 a 和 b:
import numpy as np
a = np.random.randint(1,10,10000)
b = np.array([1./len(a)]*len(a))
我有两种方法,它们肯定远离较低的性能边界。 方法1(至少不错且简短):时间:0.769315958023
def approach_2(a,b):
bResult = [sum(b[i == a]) for i in np.unique(a)]
aResult = np.unique(a)
方法 2(numpy.groupby,非常慢)时间:4.65299129486
def approach_2(a,b):
tmp = [(a[i],b[i]) for i in range(len(a))]
tmp2 = np.array(tmp, dtype = [('a', float),('b', float)])
tmp2 = np.sort(tmp2, order='a')
bResult = []
aResult = []
for key, group in groupby(tmp2, lambda x: x[0]):
aResult.append(key)
bResult.append(sum([i[1] for i in group]))
更新:Pablo 的 Approach3。时间:1.0265750885
def approach_Pablo(a,b):
pdf = defaultdict(int);
for x,y in zip(a,b):
pdf[x] += y
更新:方法 4,由 Unutbu 提供。时间:0.184849023819 [WINNER SO FAR, but a as integer only]
def unique_Unutbu(a,b):
x=np.bincount(a,weights=b)
aResult = np.unique(a)
bResult = x[aResult]
也许有人找到了比我更聪明的解决方案:)
【问题讨论】:
-
我的意思是您不能假设列表 a 已排序。
标签: python performance sorting numpy group-by