2つの順序付けられていない同じ長さの配列およびbが与えられる:Pythonのグループ、および配列bをまとめ - 性能
a = [7,3,5,7,5,7]
b = [0.2,0.1,0.3,0.1,0.1,0.2]
を私は要素によるグループたい:
aResult = [7,3,5]
あるいは
bResult = [0.2 + 0.1 + 0.2, 0.1, 0.3 + 0.1] = [0.5, 0.1, 0.4]
、ランダムAおよびBI:Bの要素の
加算は(例は、確率密度関数を要約するために使用されます) n Python:
2つのアプローチがありますが、これはパフォーマンスの低い境界からは離れています。 アプローチ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]))
更新:Approach3、パブロによる。時間:1.0265750885
def approach_Pablo(a,b):
pdf = defaultdict(int);
for x,y in zip(a,b):
pdf[x] += y
更新:Approut 4 by Unutbu。時間:0.184849023819 [SO FAR WINNERが、整数としてのみ]
def unique_Unutbu(a,b):
x=np.bincount(a,weights=b)
aResult = np.unique(a)
bResult = x[aResult]
たぶん誰かが私よりも、この問題に対するよりスマートな解決策を見つけた:)
順序付けられていない配列とは何ですか? –
私はあなたがリストaがソートされているとは仮定できないことを意味しました。 – Helga