2016-11-21 2 views
9

Ich halte mich für eine erfahrene numpy Benutzer, aber ich bin nicht in der Lage, eine Lösung für das folgende Problem zu finden. Es sei angenommen, gibt es folgende Felder:Numpy blockweise reduzieren Operationen

# sorted array of times 
t = numpy.cumsum(numpy.random.random(size = 100)) 
# some values associated with the times 
x = numpy.random.random(size=100) 
# some indices into the time/data array 
indices = numpy.cumsum(numpy.random.randint(low = 1, high=10,size = 20)) 
indices = indices[indices <90] # respect size of 100 
if len(indices) % 2: # make number of indices even 
    indices = indices[:-1] 

# select some starting and end indices 
istart = indices[0::2] 
iend = indices[1::2] 

Was ich jetzt will x den Wert Array reduzieren angesichts der bezeichneten Intervalle von istart und iend. I.e.

# e.g. use max reduce, I'll probably also need mean and stdv 
what_i_want = numpy.array([numpy.max(x[is:ie]) for is,ie in zip(istart,iend)]) 

Ich habe gegoogelt schon viel, aber alles, was ich war blockartig Operationen über stride_tricks finden konnte, die nur für die regelmäßigen Blöcke ermöglicht. Ich war es, eine Lösung zu finden, ohne die Durchführung eine Pyhthon Schleife :-( In meiner realen Anwendung Arrays nicht in der Lage ist viel größer und Leistung spielt eine Rolle, so dass ich verwende numba.jit für den Moment.

Gibt es eine numpy Funktion Ich bin Fehl die in der Lage ist zu tun, dass

+0

Hätte 'x' immer floatende pt-Zahlen in' [0,1) '? – Divakar

+0

No. 'x' ist im Allgemeinen eine viel kompliziertere Array-Struktur. –

Antwort

7

Haben Sie bei ufunc.reduceat sah np.maximum, Sie so etwas wie tun kann:

>>> np.maximum.reduceat(x, indices) 

, die die maximalen Werte entlang der Schichten x[indices[i]:indices[i+1]] ergibt. Zu bekommen, was Sie (x[indices[2i]:indices[2i+1]) möchten, können Sie

>>> np.maximum.reduceat(x, indices)[::2] 

tun, wenn Sie nicht die zusätzlichen Berechnungen von x[inidices[2i-1]:indices[2i]] kümmern. Das ergibt folgendes:

>>> numpy.array([numpy.max(x[ib:ie]) for ib,ie in zip(istart,iend)]) 
array([ 0.60265618, 0.97866485, 0.78869449, 0.79371198, 0.15463711, 
     0.72413702, 0.97669218, 0.86605981]) 

>>> np.maximum.reduceat(x, indices)[::2] 
array([ 0.60265618, 0.97866485, 0.78869449, 0.79371198, 0.15463711, 
     0.72413702, 0.97669218, 0.86605981]) 
+1

Ich habe etwas Neues gelernt ... thx – piRSquared

+0

Super, das ist genau das, was ich gesucht habe. Ich kann einfach alle Indizes in einem Array behalten, dann mache ich keine Overhead-Berechnungen :) Vielleicht sollte ich meine Googling-Fähigkeiten verbessern ... –

0

Sie numpy.r_
wie diese verwenden:?

what_i_want = np.array([np.max(x[np.r_[ib:ie]]) for ib,ie in zip(istart,iend)]) 
Verwandte Themen