Seite 1 von 1

Verschiedener type je nach numpy Version

Verfasst: Mittwoch 8. September 2010, 14:50
von sophy
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

Re: Verschiedener type je nach numpy Version

Verfasst: Mittwoch 8. September 2010, 15:08
von BlackJack
@sophy: Kannst Du mehr über die ``if``-Abfrage verraten? Vergleichst Du da vielleicht Fliesskommazahlen ohne eine Abweichung zu berücksichtigen?

Re: Verschiedener type je nach numpy Version

Verfasst: Mittwoch 8. September 2010, 15:20
von sophy
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.

Re: Verschiedener type je nach numpy Version

Verfasst: Mittwoch 8. September 2010, 16:30
von gkuhl
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

Re: Verschiedener type je nach numpy Version

Verfasst: Mittwoch 8. September 2010, 16:40
von sophy
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...

Re: Verschiedener type je nach numpy Version

Verfasst: Mittwoch 8. September 2010, 16:48
von gkuhl
Wie geschrieben: Um zu helfen, wäre es gut zu wissen, wie du die Arrays einliest.

Re: Verschiedener type je nach numpy Version

Verfasst: Mittwoch 8. September 2010, 17:00
von sophy
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')

Re: Verschiedener type je nach numpy Version

Verfasst: Mittwoch 8. September 2010, 17:19
von gkuhl
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])