Seite 1 von 1

Nicht nachvollziehbarer Numpy-Fehler

Verfasst: Mittwoch 21. September 2016, 16:25
von pythonDau
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 :)

Re: Nicht nachvollziehbarer Numpy-Fehler

Verfasst: Mittwoch 21. September 2016, 16:41
von 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.

Re: Nicht nachvollziehbarer Numpy-Fehler

Verfasst: Mittwoch 21. September 2016, 17:02
von pythonDau
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)

Re: Nicht nachvollziehbarer Numpy-Fehler

Verfasst: Mittwoch 21. September 2016, 17:18
von BlackJack
@pythonDau: Welches Problem hast Du denn mit den ganz normalen Operatoren bei den `DataFrame`\s?

Re: Nicht nachvollziehbarer Numpy-Fehler

Verfasst: Mittwoch 21. September 2016, 17:26
von Sirius3
So sehen Deine 40 Zeilen aus:

Code: Alles auswählen

zetaRRel = (1 - ptRelRatio) / (1 - (1 + (_KAPPA - 1) / 2 * MachRelIn ** 2) ** (-_KAPPA / (_KAPPA - 1)))

Re: Nicht nachvollziehbarer Numpy-Fehler

Verfasst: Donnerstag 22. September 2016, 12:25
von snafu
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.

Re: Nicht nachvollziehbarer Numpy-Fehler

Verfasst: Donnerstag 22. September 2016, 12:52
von 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. :-)