Array indexing mit "algopy"

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
SimPy
User
Beiträge: 20
Registriert: Dienstag 19. Februar 2013, 15:36

Hallo Forum,

folgender Quellcode funktioniert einwandfrei:

Code: Alles auswählen

import numpy
def fep(x):
    """ some function """
    y = numpy.zeros(3)
    pos = numpy.array([0,1,2])
    y[pos] = x[pos] + 1
    return y

x_array = numpy.array([3,4,5])
print(fep(x_array))
Also habe ich versucht, das auf algopy zu übertragen:

Code: Alles auswählen

def fun(x):
    """ some function """
    y = numpy.zeros(3)
    pos = numpy.array([0,1,2])
    y[pos] = x[pos] + 1
    return y

# forward mode without building the computational graph
# -----------------------------------------------------
x = UTPM.init_jacobian(numpy.array([3,4,5]))
y = fun(x)
algopy_jacobian = UTPM.extract_jacobian(y)
print 'jacobian = ', algopy_jacobian
Leider ohne Erfolg. Er bringt folgende Fehlermeldung:

Code: Alles auswählen

y[pos] = x[pos] +1 
File "C:\Python26\lib\site-packages\algopy\utpm\utpm.py", line 70 in__getitem__ if isinstance(sl, int) or sl == Ellipsis or isinstance(sl, slice): ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Was habe ich verbockt?
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Schreib doch mal

Code: Alles auswählen

y[pos] = x[pos] + 1
in

Code: Alles auswählen

return x + 1
um, das ist doch was die Funktion machen soll? Wenn du später nur bestimmte Indizes addieren willst, kann man das ja auch anders lösen.

Es sieht danach aus, also ob algopy nicht mit der Indizierung zurecht kommt. Im speziellen ist es wahrscheinlich dieser Vergleich

Code: Alles auswählen

sl == Ellipsis
Du könntest natürlich einfach in die Sourcen gehen und diesen korrigieren :P https://github.com/b45ch1/algopy/blob/m ... pm/utpm.py

Grüße,
anogayales
SimPy
User
Beiträge: 20
Registriert: Dienstag 19. Februar 2013, 15:36

Wenn du später nur bestimmte Indizes addieren willst, kann man das ja auch anders lösen.
Gerade um die bestimmten Indizes geht es mir! Das Beispiel, das ich gegeben habe ist nur stellvertretend für ein viel größeres Anwendungsproblem. Wenn ich die Indizierung für das kleine Beispiel lösen kann, dann - so mein Hoffnung - kann ich es auch für das große Problem knacken.
SimPy
User
Beiträge: 20
Registriert: Dienstag 19. Februar 2013, 15:36

@ anogayales: Dann frage ich mal anders: Wie wendest Du eine Array-Indizierung in "algoPy" an?
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Du kannst es ja ganz naiv in einer Schleifer lösen.

Also etwa so:

Code: Alles auswählen

In [2]: y = array([0,1,2])

In [3]: x = array([5,5,5])

In [4]: for index in y:
   ...:     x[index] += 1
   ...:

In [5]: x
Out[5]: array([6, 6, 6])
Ich würde dir aber trotzdem empfehlen einfach die Source zu fixen :P

Grüße,
anogayales
Antworten