2015-05-13 93 views
15

Ich habe ein Stück Code, der die Helmholtz-Hodge-Zerlegung berechnet. Ich habe auf meinem Mac OS Yosemite ausgeführt und es funktionierte gut. Vor einem Monat wurde mein Mac jedoch ziemlich langsam (es war wirklich alt), und ich entschied mich für ein neues Notebook (Windows 8.1, Dell).Verwendung von Numpy in verschiedenen Plattformen

Nach der Installation aller Python-Bibliotheken und so weiter, habe ich meine Arbeit mit dem gleichen Code (versioniert in Git) fortgesetzt. Und dann war das Ergebnis ziemlich komisch, ganz anders als im alten Notebook.

Zum Beispiel, was ich tue, ist zu konstruieren a und b (wirklich lange Kalkül) auf Matrizen und dann rufe ich den Solver:

s = numpy.linalg.solve(a, b) 

Dies wurde Rückkehr a (falsch, und verschiedene des Ergebnisses erhalten in meinem Mac, was richtig war).

Dann habe ich versucht, zu verwenden:

s = scipy.linalg.solve(a, b) 

Und das Programm beendet mit Code 0, aber in der Mitte. Dann habe ich nur einen einfachen Test von:

print 'here1' 
s = scipy.linalg.solve(a, b) 
print 'here2' 

Und here2 nie gedruckt wird.

Ich habe versucht:

print 'here1' 
x, info = numpy.linalg.cg(a, b) 
print 'here2' 

Und das gleiche passiert.

Ich habe auch versucht, die Lösung zu überprüfen, nachdem numpy.linalg.solve mit:

print numpy.allclose(numpy.dot(a, s), b) 

Und ich habe eine False (?!).

Ich weiß nicht, was passiert, wie eine Lösung zu finden, ich weiß nur, dass der gleiche Code in meinem Mac läuft, aber es wäre sehr gut, wenn ich es in anderen Plattformen ausführen könnte. Jetzt stecke ich in diesem Problem (habe keinen Mac mehr) und keine Ahnung von der Ursache.

Die seltsamste Sache ist, dass ich keinen Fehler auf Laufzeitwarnung, keine Rückmeldung überhaupt erhalte.

Vielen Dank für jede Hilfe.

EDIT:

Numpy Anzug Testergebnisse:

enter image description here

Scipy Anzug Testergebnisse:

enter image description here

+1

Haben Sie die Versionskonsistenz überprüft? Vielleicht hat sich etwas zwischen den Versionen auf Ihrem alten Mac und den (vermutlich) neueren Versionen auf dem neuen Computer geändert. – Ajean

+0

Ja, @Ajean. Ich steckte auch einen USB-Stick in meinen Mac, um den alten Code zu holen und ihn auf Mac- und Windows-Systemen neu zu starten. Es hat funktioniert (Mac), aber das System ist zu langsam, also würde ich es gerne auch auf einem Windows laufen lassen. Dies scheint überhaupt keinen Sinn zu ergeben. – pceccon

+2

Wenn "det (b) = 0", auch aufgrund von Präzisionsverlust, bedeutet dies, dass Ihr Problem nicht gut definiert ist. Der Kampf gegen schlecht konditionierte Matrixprobleme ist einfach nicht der richtige Weg. –

Antwort

0

Das ist nicht wirklich eine Antwort, aber this blog bespricht in der Länge die Probleme, ein numpiges Ökosystem zu haben, das sich schnell entwickelt, auf Kosten von Reproduktionen Flexibilität.

Übrigens, welche Version von numpy verwenden Sie? Die documentation für die neuesten 1.9 meldet keine Methode namens cg als die, die Sie verwenden ...

Ich schlage die Verwendung dieses Beispiels vor, damit Sie (und andere) die Ergebnisse überprüfen können.

>>> import numpy as np 
>>> import scipy.linalg 
>>> np.random.seed(123) 
>>> a = np.random.random(size=(10000, 10000)) 
>>> b = np.random.random(size=(10000,)) 
>>> s_np = np.linalg.solve(a, b) 
>>> s_sc = scipy.linalg.solve(a, b) 
>>> np.allclose(s_np,s_sc) 
>>> s_np 
array([-15.59186559, 7.08345804, 4.48174646, ..., -16.43310046, 
    -8.81301553, -10.77509242]) 
+0

Hallo @RamonCrehuet. Ich habe die Versionen in den obigen Kommentaren gepostet. Sie sind die letzten für Scipy und Numpy. CG kommt von Scipy. docs.scipy.org/doc/scipy/reference/sparse.linalg.html – pceccon

+0

Ich weiß 'cg' ist in scipy.sparse, aber Sie scheinen eine numply Funktion anzurufen. Bitte, klären Sie das. –

+0

Ich habe meinen Beitrag bearbeitet, um ein reproduzierbares Beispiel vorzuschlagen, das wir alle testen können. –

0

Ich hoffe, dass Sie die Antwort finden können - eine Option in der Zukunft ist es, eine virtuelle Maschine für jedes Ihrer Projekte zu erstellen, Docker verwenden. Dies ermöglicht eine einfache Portabilität.

Siehe einen großen Artikel here diskutieren Docker für die Forschung.

+0

Docker erstellt keine virtuellen Maschinen, es führt Prozesse aus. Da der Host-Kernel und der Prozess-Kernel gemeinsam genutzt werden, ändert dies höchstwahrscheinlich kein grundlegendes Plattform-Verhalten. – GManNickG

1

herunterladen Anaconda Paket-Manager

http://continuum.io/downloads

Wenn Sie diese herunterladen es bereits alle Abhängigkeiten für numpy für Sie ausgearbeitet. Es wird lokal installiert und funktioniert auf den meisten Plattformen.