NumPy vektorizace algoritmů shrnout čísla se stejnými časovými razítky

hlasů
3

Mám dvě pole, P a T. P [i] je číslo, jehož časové razítko je T [i]; Tam by mohlo být reprodukovány časových razítek.

Chci produkovat další dvě pole, Q a U, kde Q [I] se časové razítko U [i], a Q [i] je součet všech prvků v P, které mají časové razítko U [i];

Například pro

P = [1, 2, 3, 4, 5] T = [0, 0, 1, 1, 1]

I bude vyrábět

Q = [3, 12] U = [0, 1];

Existuje rychlý způsob, jak toho dosáhnout v Numpy, že to snad vektoruje?

Položena 04/11/2011 v 00:06
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
4

Používání numpy 1.4 nebo vyšší:

import numpy as np

P = np.array([1, 2, 3, 4, 5]) 
T = np.array([0, 0, 1, 1, 1])

U,inverse = np.unique(T,return_inverse=True)
Q = np.bincount(inverse,weights=P)
print (Q, U)
# (array([  3.,  12.]), array([0, 1]))

Vezměte prosím na vědomí, že toto je to nejrychlejší řešení. Testoval jsem na rychlosti tímto způsobem:

import numpy as np

N = 1000
P = np.repeat(np.array([1, 2, 3, 4, 5]),N)
T = np.repeat(np.array([0, 0, 1, 1, 1]),N)

def using_bincount():
    U,inverse = np.unique(T,return_inverse=True)
    Q = np.bincount(inverse,weights=P)
    return Q,U
    # (array([  3.,  12.]), array([0, 1]))

def using_lc():
    U = list(set(T))
    Q = [sum([p for (p,t) in zip(P,T) if t == u]) for u in U]
    return Q,U

def using_slice():
    U = np.unique(T)
    Q = np.array([P[T == u].sum() for u in U])
    return Q,U

Pro malé pole, roztok Wim je rychlejší (N = 1):

% python -mtimeit -s'import test' 'test.using_lc()'
100000 loops, best of 3: 18.4 usec per loop
% python -mtimeit -s'import test' 'test.using_slice()'
10000 loops, best of 3: 66.8 usec per loop
% python -mtimeit -s'import test' 'test.using_bincount()'
10000 loops, best of 3: 52.8 usec per loop

U velkých polí, roztok Joris je rychlejší (N = 1000):

% python -mtimeit -s'import test' 'test.using_lc()'
100 loops, best of 3: 9.93 msec per loop
% python -mtimeit -s'import test' 'test.using_slice()'
1000 loops, best of 3: 390 usec per loop
% python -mtimeit -s'import test' 'test.using_bincount()'
1000 loops, best of 3: 846 usec per loop

Pochybuji, že je to důležité v tomto případě, ale kritéria může měnit v závislosti na verzi NumPy, Python, OS nebo hardwaru. To by nebylo na škodu zopakovat tyto ukazatele na vašem počítači.

Odpovězeno 04/11/2011 v 00:43
zdroj uživatelem

hlasů
2
import numpy as np
P = np.array([1, 2, 3, 4, 5]) 
T = np.array([0, 0, 1, 1, 1])

U = np.unique(T)
Q = np.array([P[T == u].sum() for u in U])

poskytuje

In [17]: print Q, U
[3 12] [0 1]

Ne tak docela vectorized, ale rychlejší než řešení s seznamech.

Pokud chcete, silnější tohoto druhu skupinového funkcemi, možná můžete se podívat na pandy .

Odpovězeno 04/11/2011 v 00:25
zdroj uživatelem

hlasů
1
>>> P = [1, 2, 3, 4, 5]; T = [0, 0, 1, 1, 1]
>>> U = list(set(T))
>>> Q = [sum([p for (p,t) in zip(P,T) if t == u]) for u in U]
>>> print Q, U
[3, 12] [0, 1]
Odpovězeno 04/11/2011 v 00:15
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more