Verschiedener type je nach numpy Version

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
sophy
User
Beiträge: 10
Registriert: Dienstag 12. Januar 2010, 10:34

Hallo,
in meinem Programm wird in einer if-Abfrage der Wert einer Variablen abgefragt. Auf Rechner1 trifft die Bedingung zu, auf Rechner2 nicht. Auf der Suche nach dem Grund habe ich herausgefunden, dass auf Rechner1 die Variable den type 'numpy.ndarray' hat, auf Rechner2 allerdings lediglich 'array'. Eine Überprüfung der Versionsnummern ergab, dass auf Rechner1 python 2.6.4 und numpy 1.3.0 installiert ist, auf Rechner2 python 2.6.2 und numpy 1.2.1. Auf Grund der Rechenzeit muss ich auf mehreren Rechnern gleichzeitig rechnen und das Problem mit den niedrigeren Versionsnummern tritt bei mehreren Rechnern auf. Auf allen Rechnern aktuellere Versionen zu installieren würde einige Zeit dauern und ich würde das wenn möglich gerne vermeiden. Meine Frage ist nun ob jemand weiß ob/wie man den 'array' in ein 'numpy.ndarray' konvertieren kann, oder ob dieser type nur neueren python/numpy Versionen bekannt ist. Ich habe schon versucht über google eine Antwort darauf zu finden, was für Veränderungen in den jeweiligen Versionen eingeführt wurden, habe aber bisher keine vollständige Dokumentation gefunden. Vielleicht bin ich aber auch auf der völlig falschen Fährte? Für Tipps wäre ich sehr dankbar!
Sophy
BlackJack

@sophy: Kannst Du mehr über die ``if``-Abfrage verraten? Vergleichst Du da vielleicht Fliesskommazahlen ohne eine Abweichung zu berücksichtigen?
sophy
User
Beiträge: 10
Registriert: Dienstag 12. Januar 2010, 10:34

Es wird lediglich gecheckt, ob das array Element ungleich Null ist:
[python]
for j in range(whatever):
if x[j]!=0:
y[j]=np.masked
[/python]
Wenn ich mir explizit x[j] ausgeben lasse, dann erscheint auf Rechner1 '0.0' auf Rechner2 'array(0.0, 'f')'. Deswegen war ich ursprünglich stutzig geworden.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Kann es sein, dass dein "y"-array doppelt verschachtelt ist?

Code: Alles auswählen

In [26]: np.array([[1]])
Out[26]: array([[1]])

In [27]: x = np.array([1])

In [28]: y = np.array([[1]])

In [29]: x[0]
Out[29]: 1

In [30]: y[0]
Out[30]: array([1])
Ansonsten zeig mal den Code, wo die Arrays erstellt werden.

Grüße
Gerrit
sophy
User
Beiträge: 10
Registriert: Dienstag 12. Januar 2010, 10:34

Das array wird aus einer Datei eingelesen. Und ja, ich schätze mit den älteren Versionen ist es verschachtelt. Habe gerade probiert es mir so

Code: Alles auswählen

print x[j][0]
auszugeben, und ich erhalte endlich den tatsächlichen Wert '0.0'. Allerdings läuft das Programm so dann nur unter den älteren Versionen, unter den neueren wieder kommt eine nette Fehlermeldung: IndexError: invalid index to scalar variable. Vielleicht kann man im Programm die Version abfragen und entsprechend 2 cases schreiben? Dafür müsste ich aber endlich herausfnden, ob es an der anderen python oder der anderen numpy Version liegt...
Zuletzt geändert von sophy am Mittwoch 8. September 2010, 17:02, insgesamt 1-mal geändert.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Wie geschrieben: Um zu helfen, wäre es gut zu wissen, wie du die Arrays einliest.
sophy
User
Beiträge: 10
Registriert: Dienstag 12. Januar 2010, 10:34

so:

Code: Alles auswählen

import numpy as np
import scipy as sp
from Scientific.IO.NetCDF import *

def read_var(fid,var_name):
   invar=fid.variables[var_name]
   var=invar.getValue()
   return var

fid=NetCDFFile(file_in,'r')
x=read_var(fid,'x')
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Das Problem liegt dann wohl eher an "Scientific.IO.NetCDF". Hat deine scipy-Version das Module "scipy.io.netcdf". Vielleicht geht es damit besser. Ansonsten hilft noch, wenn deine Arrays 1-dimensional sind:

Code: Alles auswählen

In [46]: y = np.array([[1],[2]])

In [47]: x = np.array([1,2])

In [48]: x.flatten()
Out[48]: array([1, 2])

In [49]: y.flatten()
Out[49]: array([1, 2])
Antworten