von Matlab nach Python

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
juve88
User
Beiträge: 3
Registriert: Montag 30. Juni 2014, 15:22

Hey leude!

ich hab da nen Problem! ich hab da nen Matlab code und den möchte ich gerne in Python haben! Komm aber nicht weiter! Könnt ihr mir helfen?
mein mom. Programm:

Code: Alles auswählen

from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
import numpy as np
from pylab import *

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
 
X=[600,700,800];
Y=[30,60,90];
Z= array[[0.3168,0.1638,0.0742]
    [0.2843,0.1515,0.04867]
    [0.2575,0.1187,0.05717]]

ax.plot_wireframe(X, Y, Z)

plt.show()


Matlab:

Code: Alles auswählen

X=[600,700,800];
Y=[30,60,90];
Z=[0.3168 0.1638 0.0742;
    0.2843 0.1515 0.04867
    0.2575 0.1187 0.05717];
%% Interpolation
[xi,yi] = meshgrid(600:10:800 ,30:1:90);
zi= interp2(X,Y,Z,xi,yi); 
%% Surfaceplot
surf(xi,yi,zi)
shading faceted  
xlabel('Temperatur [grad C]'); 
ylabel('Zeit [min]');
zlabel('Verzug [mm]');
title('Ofen','fontsize',16);
view([112 30]);
könnt ihr mir helfen??
Zuletzt geändert von Anonymous am Montag 30. Juni 2014, 16:19, insgesamt 1-mal geändert.
Grund: Quelltext in Code-Tags gesetzt.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Sollen wir beides nun ausprobieren und den Unterschied suchen?

Ich denke besser ist, wenn Du noch ein bisschen was erzählst:
Wirft das Python-Skript einen Fehler? Wenn ja, wie lautet der Stack-Trace?
Oder sehen beide Plots einfach nur unterschiedlich aus? Wenn ja, was ist der Unterschied?

Außerdem macht es Deinen Beitrag leserlicher, wenn Du Code-Stellen auch als solchen postest. Mach zwei getrennte Code-Blöcke, einen für Python und einen für Matlab. Mit dem Vorschau-Knopf kannst Du vorher das ganze kontrollieren und mit bearbeiten kannst Du Deinen Beitrag noch so abändern, dass keiner mehr verstehen wird, was ich zu Deiner ersten Version geschrieben habe.
a fool with a tool is still a fool, www.magben.de, YouTube
juve88
User
Beiträge: 3
Registriert: Montag 30. Juni 2014, 15:22

HEy!

Ja sorry!

ne ich wollte eigentlich den Matlab-Code in einem Python-code umwandeln! Der Pythoncode ist schon mein erster Versuch! Jedoch kommt der Fehler :

Code: Alles auswählen

 line 16, in <module>
    [0.2843,0.1515,0.04867]
TypeError: list indices must be integers, not tuple
Es soll ein 3D Oberflächendiagramm rauskommen! Da ich jedoch zuhause kein Matlab habe wollte ich das Programm umschreiben! Vielleicht hilft mir ja jemand!
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@juve88: bevor Du wild drauflos schreibst, solltest Du Dir die Syntax von Python anschauen, indem Du ein Tutorium Deiner Wahl durcharbeitest:

Code: Alles auswählen

 a = [1,2,3]
print a[1]
ist das selbe wie

Code: Alles auswählen

print [1,2,3][1]
BlackJack

@juve88: Oder noch mal anders ausgedrückt ``[…]`` ist nur dann eine Listendefinition wenn rechts davon kein Ausdruck steht. Wenn rechts davon ein Ausdruck steht, dann sind die eckigen Klammern der Indexoperator für den Zugriff auf das was rechts davon steht und der Ausdruck in den Klammern wird ausgewertet als wäre er nicht in diesen Klammern (die spezielle Slice-Notation mal ausgenommen) und ergibt immer *ein* Objekt als Ergebnis. Also sind bei ``something[a,b,c]`` die Kommas zwischen den Elementen dafür verantwortlich das der Ausdruck zwischen den Klammern ein Tupel mit drei Elementen ist. Rechts von dem beanstandeten Indexoperator steht eine Liste und auf eine Liste kann man nicht mit einem Tupel als Index zugreifen — was die Fehlermeldung ja sagt:

Code: Alles auswählen

In [466]: [1, 2, 3][1]
Out[466]: 2

In [467]: [1, 2, 3][1, 2]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-467-a1d859a2062a> in <module>()
----> 1 [1, 2, 3][1, 2]

TypeError: list indices must be integers, not tuple
Wie bei allen Operatoren kann man zwischen Operand und Operator beliebig viel Leerraum lassen und wenn anderweitig noch offene Klammern ausstehen, dann ist für den Python-Compiler die ”logische” Zeile noch nicht zuende, darum kann man dann auch Zeilenumbrüche in dem Leerraum zwischen Operand und Operator haben.

Code: Alles auswählen

In [468]: [[1, 2, 3]
   .....:  [1]]
Out[468]: [2]

In [469]: [[1, 2, 3]
   .....:  [1, 2]]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-469-7c20c2f10f23> in <module>()
      1 [[1, 2, 3]
----> 2  [1, 2]]

TypeError: list indices must be integers, not tuple
juve88
User
Beiträge: 3
Registriert: Montag 30. Juni 2014, 15:22

Jop,

hab gemerkt das ich da nen Fehler hatte! nun hab ich das nochmals geändert und siehe da! es karm was! nur nicht wie gewünscht!

Code: Alles auswählen

from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
import numpy as np
from pylab import *

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

X=[600,700,800];
Z=[30,60,90];
Y= np.array ([[0.3168,0.1638,0.0742],[0.2843,0.1515,0.04867],[0.2575,0.1187,0.05717]])


surf=ax.plot_surface(X,Y,Z, cmap=cm.jet , rstride=2, cstride=2, linewidth=0)
fig.colorbar(surf)

##ax.set_xlabel('X Temperatur [°C]')
##ax.set_ylabel('Y Zeit [min]')
##ax.set_zlabel('Z Verzug [mm]')     


plt.show()
Nun Vergleiche ich aber meine beide Ergebnisse und merke
1. Wieso ist beim Python-code keine Cmap
2. Wieso sehen die Grafiken doch so unterschiedlich aus?
3. Wie muss ich mein Code optimieren?
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Probier das mal

Code: Alles auswählen

from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
import numpy as np
from pylab import *
from scipy.interpolate import interp2d
 
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
 
X=np.array([600,700,800])
Y=np.array([30,60,90])
Z=np.array([[0.3168,0.1638,0.0742],
            [0.2843,0.1515,0.04867],
            [0.2575,0.1187,0.05717]])

xi_1d = np.linspace(600,800,21)
yi_1d = np.linspace(30,90,61)
xi_2d, yi_2d = np.meshgrid(xi_1d, yi_1d)
z_fkt = interp2d(X,Y,Z)
zi = z_fkt(xi_1d,yi_1d)
 
surf=ax.plot_surface(xi_2d,yi_2d,zi, rstride=1, cstride=1, cmap=cm.coolwarm)
fig.colorbar(surf)
plt.show()
Matlab und (Numpy,Scipy,Matplotlib) sind sich ziemlich ähnlich. Wenn Du in Matlab "meshgrid" und "interp2" benutzt, dann brauchst Du das auch im Python Skript.
a fool with a tool is still a fool, www.magben.de, YouTube
Antworten