MATLAB interp2d konnte nicht in Python scipy.interp interpretiert werden

Der folgende Code ist nur, um den Kontext zu verstehen. Meine Frage verlangt nicht viel Verständnis dafür. Es bedarf einer einfachen Übersetzung einer Zeile von MATLAB-Code in Python.

us = np.linspace(-(1023)/2,(1023)/2,1024) vs = np.linspace(-(1023)/2,(1023)/2,1024) uu,vv = np.meshgrid(-us,vs) pu = ((((rx*SDD)/(ry+SOD))+us[0])/(-du))+1 xs = np.linspace(-(360-1)/2,(nx-1)/2,360) ys = np.linspace(-(360-1)/2,(ny-1)/2,360) zs = np.linspace(-(360-1)/2,(ny-1)/2,360) xx,yy = np.meshgrid(xs,ys) angle_rad = np.linspace(0,359,360) angle_rad = angle_rad*np.pi/180 for i in range(0,360) : vol = np.zeros((360,360,360)) rx = xx*np.cos(angle_rad[i]-np.pi/2) + yy*np.sin(angle_rad[i]-np.pi/2) ry = -xx*np.sin(angle_rad[i]-np.pi/2) + yy*np.cos(angle_rad[i]-np.pi/2) pu = ((((rx*370)/(ry+9))+us[0])/(-51.2/1024))+1 for iz in range(0,360) : pv = ((((zs[iz]*370)/(ry+9))-vs[0])/(51.2/1024)) +1 

Also nach diesem Schritt sollte der Code interpolieren und in MATLAB ist es so:

  • Keras + Tensorflow: Vorhersage auf mehrere gpus
  • E-Mail-Anhang erhalten als "noname"
  • Python-Anwendung mit Apache-Spark einreichen
  • Django: möchte ein Formular für dynamisch geänderte Sequenzdaten haben
  • Wie bekomme ich das Captcha-Bild mit dem Mechanisieren
  • Unbegrenzte Seiten, um im Simulator zu würfeln
  •  vol(:,:,iz) = interp2(uu,vv ,proj',pu,pv,'linear'); This is in MATLAB 

    Meine proj, uu und vv sind (1024,1024) und pu, pv sind (360.360). Ich muss die obige Zeile in Python umwandeln. Ich habe versucht, scipy.interpolate zu verwenden, aber es gibt folgende Fehler beim Versuchen:

     vol[:,:,iz] = Ratio*(interp2d(uu,vv,proj,pu,pv,'cubic')) 

    TypeError: unhashable type: 'numpy.ndarray'

     vol[:,:,iz] = Ratio*(interp2d(uu,vv,proj,'cubic')) 

    OverflowError: Zu viele Datenpunkte zu interpolieren

     vol[:,:,iz] = Ratio*(interp2d(proj,pu,pv,'cubic')) 

    ValueError: x und y müssen gleiche Längen für nicht rechteckiges Raster haben

     vol[:,:,iz] = Ratio*(interp2d(pu,pv,proj,'cubic')) 

    ValueError: Ungültige Länge für Eingabe z für nicht rechteckiges Raster

    Ich habe alle scipy.interpolate Dokumentationen gelesen und keiner schien zu helfen. Könnte jemand herausfinden, was falsch ist?

  • Wie akzeptiere ich die Eingabe von Pfeiltasten oder akzeptiere direktionale Eingabe?
  • Stripping alles, aber alphanumerische Zeichen aus einer Zeichenfolge in Python
  • Wie man softmax auf einem Array / Vektor mit riesigen positiven und negativen Werten in TensorFlow anwendet?
  • Baumplotten in Python
  • Schafft separate Funktionen anstelle einer großen langsamen Bearbeitungszeit?
  • Begrenzung des Quarysets von Einträgen, die für einen Django-Admin Inline angezeigt werden
  • One Solution collect form web for “MATLAB interp2d konnte nicht in Python scipy.interp interpretiert werden”

    Das Problem auf einer breiten Skala ist, dass Sie die Dokumentation betrachten, aber Sie versuchen nicht, es zu verstehen. Wenn Sie eine bestimmte Funktion interp2d im Modul scipy.interpolate , dann schauen Sie sich die Funktion der Dokumentation an , wie @pv auch in einem Kommentar vorgeschlagen . Die Tatsache, dass Sie die Argumente rund um den Ort zu werfen, zeigt deutlich, dass Sie versuchen, eine Funktion auf der Grundlage von Vermutung zu verwenden. Es wird nicht funktionieren: eine Funktion wurde mit einer gegebenen Syntax implementiert, und es wird nur so funktionieren.

    Also schau dir die Unterschrift der Funktion an:

    Klasse scipy.interpolate.interp2d (x, y, z, kind = 'linear', copy = True, bounds_error = False, fill_value = nan)

    Die Bedeutung der Parameter wird nachfolgend erläutert. Sie können deutlich sehen, dass es 3 obligatorische Parameter gibt: x , y , z . Es sind keine anderen Array-bewerteten Eingaben zulässig. Denn interp2d konstruiert nur eine Interpolationsfunktion, die Sie dann verwenden sollten, um die interpolierten Werte auf einem Mesh zu berechnen (im Gegensatz zu MATLAB, wo interp2d die interpolierten Werte direkt gibt). Also kannst du anrufen

     myfun = interp2(uu,vv,proj,'linear') 

    Um eine interpolierende Funktion zu erhalten . Sie können dann bei den angegebenen Werten ersetzen, aber beachten Sie, dass die Funktion myfun 1d Eingang erwarten wird, und es wird ein Netz intern konstruieren. So vorausgesetzt, dass Ihr Ausgabe-Mesh als gebaut wird

     puu,puv = np.meshgrid(puu_vec,puv_vec) 

    (Was wohl nicht der Fall ist, aber ich komme später noch zurück), brauchst du

     vol[:,:,iz] = Ratio*myfun(puu_vec,puv_vec) 

    Um die Ausgabe zu erhalten, die du brauchst

    Allerdings gibt es einige wichtige Punkte, die Sie beachten sollten.

    1. In MATLAB haben Sie interp2d(uu,vv,proj',...) , aber stellen Sie sicher, dass für scipy die Elemente von uu , vv und proj in der gleichen Reihenfolge sind. Um auf der sicheren Seite zu sein: Im Falle einer asymmetrischen Maschengröße sollte die Form von uu , vv und proj alle gleich sein.
    2. In MATLAB verwenden Sie 'linear' Interpolation, während in Python Sie 'cubic' . Ich bin mir nicht sicher, dass das genau das ist, was du willst, wenn du deinen Code in eine neue Sprache portierst.
    3. Es scheint mir, dass Ihr Ausgabe-Gitter nicht durch ein rechteckiges Gitter definiert ist, als ob von meshgrid , was darauf hindeutet, dass interp2d möglicherweise nicht für Ihren Fall geeignet ist . Wie auch immer, ich hatte einige seltsame Erfahrungen mit interp2d , und ich würde es nicht vertrauen. Also, wenn es nicht für Ihre erwartete Ausgabe geeignet ist, würde ich empfehlen, mit scipy.interpolate.griddata stattdessen zu verwenden. Diese Funktion gibt Ihnen interpolierte Punkte direkt: Ich schlage vor, dass Sie versuchen, herauszufinden, seine Verwendung auf der Grundlage des Handbuchs 🙂 Meine verknüpfte Antwort kann auch helfen. Sie können die Art der Interpolation auf die gleiche Weise einstellen, aber Ihre Ausgabe kann jede Menge von verstreuten Punkten sein, wenn Sie möchten.
    Python ist die beste Programmiersprache der Welt.