Nicht nachvollziehbarer Numpy-Fehler

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
pythonDau
User
Beiträge: 2
Registriert: Mittwoch 21. September 2016, 16:15

Hallo zusammen,

ich möchte mittels numpy einen Formelzusammenhang ermitteln und erhalte dabei den Fehler "TypeError: return arrays must be of ArrayType". Leider bin ich langsam am Verzweifeln, da ich mit dem Fehler nichts anganfen kann und mir Google auch nicht weiterhelfen konnte. Letzlich taucht er in einer Zeile auf, in der ich von 1,4 den Wert 1 subtrahiere.

Für euch habe ich ein Minimalbeispiel erstellt, anhand dessen ihr meine Berechnung nachvollziehen könnt:

Code: Alles auswählen

_KAPPA = 1.4  
ptRelRatio = 0.95
MachRelIn = 0.8

zetaRRel = np.divide(
    np.subtract(
        1,
        ptRelRatio
    ),
    np.subtract(
        1,
        np.power(
            np.add(
                1,
                np.multiply(
                    np.divide(
                        np.subtract(
                            _KAPPA,
                            1
                        ),
                        2
                    ),
                    np.power(
                        MachRelIn,
                        2
                    )
                ),
                np.divide(
                    np.multiply(
                        -1,
                        _KAPPA
                    ),
                    np.subtract(
                        _KAPPA,
                        1 # <----- IN DIESER ZEILE SOLL SICH DER FEHLER LAUF DEBUGGING VERSTECKEN
                    )
                )
            )
        )
    )
)


Habt ihr einen Tipp für mich? ich freue mich über Hilfe jeglicher Art :) Bereits jetzt ein dickes Dankeschön an euch für eure Hilfe, Mühe & Zeit.


Grüße
Der pythonDAU :)
Zuletzt geändert von Anonymous am Mittwoch 21. September 2016, 16:35, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@pythonDau: Das Problem ist der `np.add()`-Aufruf. Was hast Du Dir bei dem dritten Argument gedacht? Schau mal in die Dokumentation was der bedeutet.

An der Stelle frage ich mich auch warum Du die ganzen Funktionen verwendest, statt einfach Operatoren‽ Warum überhaupt Numpy? Hier ist kein Array in Sicht. War das Ziel es möglichst schwer lesbar und umständlich zu gestalten? ;-)

Edit: `np.power()` bekommt dafür nur *ein* Argument, was auch falsch ist.
pythonDau
User
Beiträge: 2
Registriert: Mittwoch 21. September 2016, 16:15

BlackJack hat geschrieben:@pythonDau: Das Problem ist der `np.add()`-Aufruf. Was hast Du Dir bei dem dritten Argument gedacht? Schau mal in die Dokumentation was der bedeutet.
Ganz herzlichen Dank. Ich habe den Fehler vor lauter Klammern nicht mehr gesehen - die Methoden bekommen natürlich nur zwei Argumente übergeben und nicht drei (oder eins). Ich scheinen den Fehler einfach nicht mehr gesehen zu haben. Den - richtigen - Code habe ich unten angehängt.
BlackJack hat geschrieben:An der Stelle frage ich mich auch warum Du die ganzen Funktionen verwendest, statt einfach Operatoren‽ Warum überhaupt Numpy? Hier ist kein Array in Sicht. War das Ziel es möglichst schwer lesbar und umständlich zu gestalten? ;-)
Bei dem Code handelt es sich um mein Minimalbeispiel. In meinem Realen Code arbeite ich mit Pandas DataFrames, weshalb ich auf die vermeintlich umständlichere Lösung meine zurückgreifen zu müssen. Falls das einfacher möglich ist bin ich für Vorschläge immer offen.

Nochmal Danke.

Hier der fehlerfreie Code:

Code: Alles auswählen

import numpy as np

_KAPPA = 1.4
ptRelRatio = 0.95
MachRelIn = 0.8

zetaRRel = np.divide(
    np.subtract(
        1,
        ptRelRatio
    ),
    np.subtract(
        1,
        np.power(
            np.add(
                1,
                np.multiply(
                    np.divide(
                        np.subtract(
                            _KAPPA,
                            1
                        ),
                        2
                    ),
                    np.power(
                        MachRelIn,
                        2
                    )
                )
            ),
            np.divide(
                np.multiply(
                    -1,
                    _KAPPA
                ),
                np.subtract(
                    _KAPPA,
                    1
                )
            )
        )
    )
)
print(zetaRRel)
BlackJack

@pythonDau: Welches Problem hast Du denn mit den ganz normalen Operatoren bei den `DataFrame`\s?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

So sehen Deine 40 Zeilen aus:

Code: Alles auswählen

zetaRRel = (1 - ptRelRatio) / (1 - (1 + (_KAPPA - 1) / 2 * MachRelIn ** 2) ** (-_KAPPA / (_KAPPA - 1)))
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Und selbst mit Operatoren wäre es wahrscheinlich hilfreich, wenn man Zwischenergebnisse speichert. Nur weil man alles in eine Zeile schreiben kann, heißt nicht, dass es immer sinnvoll ist. Der Computer hat damit kein Problem, aber dafür die Menschen, die es lesen und nachvollziehen müssen.
BlackJack

Man kann ja einen Kommentar dazu schreiben:
[codebox=text file=Unbenannt.txt] -ptRelRatio + 1
───────────────────────────────────────────
-_KAPPA
──────────
_KAPPA - 1
⎛ 2 ⎛_KAPPA 1⎞ ⎞
1 - ⎜MachRelIn ⋅⎜────── - ─⎟ + 1⎟
⎝ ⎝ 2 2⎠ ⎠ [/code]

Edit:

Ansonsten kann man die Formel auch umstellen zu:

Code: Alles auswählen

                                                 _KAPPA  
                                               ──────────
                                               _KAPPA - 1
                  ⎛         2                 ⎞          
(-ptRelRatio + 1)⋅⎝MachRelIn ⋅(_KAPPA - 1) + 2⎠          
─────────────────────────────────────────────────────────
                                                _KAPPA   
      _KAPPA                                  ────────── 
    ──────────                                _KAPPA - 1 
    _KAPPA - 1   ⎛         2                 ⎞           
 - 2           + ⎝MachRelIn ⋅(_KAPPA - 1) + 2⎠
Und das dann als Code so schreiben:

Code: Alles auswählen

x0 = _KAPPA - 1
x1 = _KAPPA / x0
x2 = (MachRelIn**2 * x0 + 2)**x1
result = x2 * (-ptRelRatio + 1) / (-2**x1 + x2)
Mit freundlicher Untrstützung von Sympy. :-)
Antworten