Với hai mảng có thứ tự của cùng một độ dài a và b:Python nhóm bằng mảng một, và tóm tắt mảng b - Hiệu suất
a = [7,3,5,7,5,7]
b = [0.2,0.1,0.3,0.1,0.1,0.2]
Tôi muốn nhóm của các yếu tố trong một:
aResult = [7,3,5]
tổng hợp trên các yếu tố trong b (Ví dụ sử dụng để tóm tắt một hàm mật độ xác suất):
bResult = [0.2 + 0.1 + 0.2, 0.1, 0.3 + 0.1] = [0.5, 0.1, 0.4]
Ngoài ra, một cách ngẫu nhiên và bi n python:
import numpy as np
a = np.random.randint(1,10,10000)
b = np.array([1./len(a)]*len(a))
Tôi có hai cách tiếp cận, chắc chắn nằm ngoài ranh giới hiệu suất thấp hơn. Tiếp cận 1 (ít nhất là tốt đẹp và ngắn): Thời gian: 0,769315958023
def approach_2(a,b):
bResult = [sum(b[i == a]) for i in np.unique(a)]
aResult = np.unique(a)
Tiếp cận 2 (numpy.groupby, khủng khiếp chậm) Thời gian: 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]))
Cập nhật: Approach3, bởi Pablo. Thời gian: 1.0265750885
def approach_Pablo(a,b):
pdf = defaultdict(int);
for x,y in zip(a,b):
pdf[x] += y
Cập nhật: Cách tiếp cận 4, bởi Unutbu. Thời gian: ,184849023819 [WINNER SO FAR, nhưng một số nguyên như chỉ]
def unique_Unutbu(a,b):
x=np.bincount(a,weights=b)
aResult = np.unique(a)
bResult = x[aResult]
Có lẽ ai đó tìm thấy một giải pháp thông minh hơn cho vấn đề này hơn tôi :)
Mảng không có thứ tự là gì? –
Tôi có nghĩa là bạn không thể giả định rằng danh sách được sắp xếp. – Helga