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:

  • Python - Mit regex, um mehrere Spiele zu finden und auszudrucken
  • Kein Modul namens Konstanten
  • Jupyter Notebook: Interaktive Handlung mit Widgets
  • Getting "msg: Failed to find benötigte ausführbare easy_install" beim Versuch, eine vagrant Instanz mit einem möglichen zu bringen
  • Python Requests-Bibliothek kann manchmal keine Website öffnen, die ein Browser öffnen kann
  • Python3: list () vom generator: merkwürdiges verhalten bei der nachgiebigkeit von geänderten listen
  •  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?

  • Pytest 2.3 Hinzufügen von teardowns innerhalb der Klasse
  • Extrahieren Sie die Suchergebnisse von Google
  • Ningx, uwsgi, python permanente mysql fehler nach einiger zeit von start anwendung
  • Command Cooldown für einen Python Twitch Bot
  • Python Frage: Jahr und Tag des Jahres bis heute?
  • Python enum - immer Wert von enum auf String Umwandlung
  • 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.