2015-05-06 20 views
6

sagen, dass ich Array x und y:Numpy: basierend auf vorherigem Element berechnen?

x = numpy.array([1,2,3,4,5,6,7,8,9,10]) # actual content is the a result of another calculation step 

Es gibt eine Formel für y, und jedes Element auf dem vorhergehenden Element basiert, lassen i den Index y bezeichnen, wobei jedes Element ist:

y[i] = y[i-1] * 2 + x[i] 

Wenn Sie das erste Element berechnen, lassen Sie . Mit anderen Worten, sollte y sein:

[101, 204, 411, 826, 1657, 3320, 6647, 13302, 26613, 53236] 

Wie kann ich berechnen y mit numpy?

+0

Was wäre, den Startwert von 'Y', das heißt 'y [0]'? – Divakar

+0

Nun, es gibt einen künstlichen Startwert von 50. –

+0

Was ist los mit dem Code, den Sie geschrieben haben? –

Antwort

4

Lets einige der Elemente in Ihrer Sequenz bauen:

y[0] = 2*y[-1] + x[0] 
y[1] = 2*y[0] + x[1] = 4*y[-1] + 2*x[0] + x[1] 
y[2] = 2*y[1] + x[2] = 8*y[-1] + 4*x[0] + 2*x[1] + x[2] 
... 
y[n] = 2**(n+1)*y[-1] + 2**n*x[0] + 2**(n-1)*x[1] + ... + x[n] 

Es kann nicht ohne weiteres ersichtlich sein, aber man kann die obige Sequenz baut mit numpy wie etwas zu tun:

n = len(x) 
y_1 = 50 
pot = 2**np.arange(n-1, -1, -1) 
y = np.cumsum(pot * x)/pot + y_1 * 2**np.arange(1, n+1) 
>>> y 
array([ 101, 204, 411, 826, 1657, 3320, 6647, 13302, 26613, 53236]) 

Der Diese Art von Lösungen liegt darin, dass sie nicht sehr allgemein sind: Eine kleine Änderung Ihres Problems kann den gesamten Ansatz nutzlos machen. Aber wann immer Sie ein Problem mit ein wenig Algebra lösen können, wird es mit ziemlicher Sicherheit jeden algorithmischen Ansatz übertreffen.

+0

Ich hatte etwas ähnliches bereit, gepostet zu werden, nette Arbeit! – Divakar

+0

Vielen Dank. Genau das suche ich. –

-1

Hier ist, wie Sie es mit Python zu tun:

x = [1, 2, 3, 4, 5, 6, 7, 8 ,9, 10] 
y = [50] 
for i in range(len(x)): 
    y.append(y[-1] * 2 + x[i]) 
y = y[1:] 

Sie könnten es von dem letzten Elemente berechnet werden sollen für die nächsten i mit den neuen Werten zu verhindern.

+1

Ich würde annehmen, dass "wie berechne ich mit numpy" eine effiziente vektorisierte Version impliziert. –

+0

@AmiTavory Offenbar nicht. Ich habe gefragt, was mit seinem Code in den Kommentaren falsch ist und die Antwort war "es ist Pseudocode". Aber ich denke auch, dass Ferdinand Beyers Antwort diejenige sein sollte, die akzeptiert wird (und sie hochgestuft hat). –

+0

Es ist noch einfacher wie 'y = [50 * 2 + x [0]]; für v in x [1:]: y.append (y [-1] * 2 + v) 'und Ihre Lösung ist noch nicht richtig. – Zero

4

Wenn Sie eine rekursive Berechnung benötigen, wenn Ihre y[i] auf den berechneten y[i-1] aus dem gleichen Laufe abhängen sollte, dann scheint es keine integrierte Lösung in numpy zu sein, und Sie werden es zu berechnen, benötigen eine einfache for Schleife :

y = np.empty(x.size) 
last = 50 
for i in range(x.size): 
    y[i] = last = last * 2 + x[i] 

diese Frage Siehe: Is a "for" loop necessary if elements of the a numpy vector are dependant upon the previous element?

Andernfalls können Sie Ihre Formel in einer Zeile mit numpy implementieren:

y = np.concatenate(([50], y[:-1])) * 2 + x 

Erläuterung:

y[:-1] 

Erzeugt ein N-1 -sized Array: y_0, y_1, ... y_N-1.

np.concatenate(([50], y[:-1])) 

Erstellt eine N -sized Array mit dem ersten Element Ihr Ausgangswert 50. Also dieser Ausdruck im Grunde Ihre y[i-1] ist.

Dann können Sie die Mathematik elementweise mit numpy Array-Arithmetik durchführen.

+0

Schön! Und dann ändern Sie das erste Element von "y". – Divakar

+1

Sollte nicht die Ausgabe '[101, 204, 411, 826, 1657, 3320, 6647, 13302, 26613, 53236] sein? Mismatch mit dem zweiten Element, denke ich? Sollte 204 sein und nicht 102 – Zero

+2

Dies scheint die Wiederholung nicht richtig zu behandeln. Es sieht so aus, als ob es ein ganz neues 'y' Array aus einem alten' y' und 'x' konstruieren würde, während das gewünschte Verhalten darin zu bestehen scheint, dass die gegebene Beziehung in einem einzigen' y' Array liegt; Das gewünschte Ergebnis wäre ein Fixpunkt dieser Lösung. – user2357112

0

Dies ist, wie es mit numpy zu tun:

import numpy as np 
x = np.array([ 1, 2, 3, 4, 5, 6, 7, 8 ,9, 10 ]) 
y = np.array([ 50 ]) 
for i in np.arange(len(x)): 
    y = np.append(
        y, 
        (y[-1] * 2 + x[i]) 
       ) 
y = y[1:] 

print(y) 
Verwandte Themen