2013-07-31 41 views
5

Tôi tự hỏi liệu có ai biết cách vector hóa tính năng băm trong Python không. Ví dụ, đây là mã của tôi:Hiện tượng băm hóa tính năng băm trong python

import numpy as np 
    hashlen = 5 
    x = np.array([4, 7, 4, 2, 6, 8, 0, 6, 3, 1]) 
    h = np.array([0, 3, 1, 2, 4, 2, 1, 0, 3, 1]) 

Trong tính năng băm, h đại diện các chỉ số của vector mới Tôi băm x để, tức là chỉ số 0 của vector băm nên có 4 và 6 tóm tắt, chỉ số 1 nên có 4, 0 và 1 tóm tắt vv Kết quả là vector băm nên là:

w = np.array([ 10, 5, 10, 10, 6]) 

Một cách để làm điều này là dĩ nhiên bởi vòng lặp thông qua các chỉ số băm, ví dụ:

for itr in range(hashlen): 
     w[itr] = np.sum(x[np.where(h==itr)]) 

Đối với các vectơ lớn, độ phức tạp là hàm của hàm băm (chiều dài của vectơ băm). Nó có thể mất quá nhiều thời gian, đặc biệt là với một np.where() trong đó.

tôi muốn làm một cái gì đó như:

w = np.zeros(hashlen) 
    w[h]+= x 

Tuy nhiên, kết quả của việc này là giống như làm

w = np.zeros(hashlen) 
    w[h] = x 

bất cứ ai có thể cho tôi biết nếu tôi là thiếu cái gì ở đây? Hoặc nếu có một cách 'dễ dàng' để thực hiện băm tính năng không liên quan đến quá nhiều tính toán?

Trả lời

5

Bạn có thể sử dụng bincount với trọng lượng để làm những gì bạn đang yêu cầu:

>>> np.bincount(h,weights=x) 
array([ 10., 5., 10., 10., 6.]) 

Đối với ma trận:

>>> import numpy as np 
>>> a=np.random.randint(0,5,(50,50)) 
>>> rand=np.random.rand(5) 
>>> rand 
array([ 0.10899745, 0.35296303, 0.21127571, 0.56433924, 0.27895281]) 
>>> b=np.take(rand,a) 

#Unfortunately you cannot do it like this: 
>>> np.bincount(a,weights=b) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: object too deep for desired array 

#There we go: 
>>> np.bincount(a.flat,weights=b.flat) 
array([ 55.04371257, 172.59892108, 96.34172236, 297.40677707, 
     145.89232039]) 

này sử dụng chỉ mục ưa thích để xem những gì đang xảy ra:

>>> np.bincount(a.flat) 
array([505, 489, 456, 527, 523]) 
>>> np.bincount(a.flat)*rand 
array([ 55.04371257, 172.59892108, 96.34172236, 297.40677707, 
     145.89232039]) 
+0

Chính xác những gì tôi đang tìm kiếm. Cám ơn rất nhiều! –

+0

Chỉ tò mò - có thể làm điều gì đó như thế trên ma trận thay vì vectơ không? Không có vòng lặp của khóa học. –

+0

Đã cập nhật cho ma trận. Có một số cách khác nếu bạn đang tìm kiếm một thứ khác. – Daniel