where() in numpy

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
eisley
User
Beiträge: 8
Registriert: Dienstag 29. April 2014, 20:18

hallo zusammen

ich benutze python im zusammenhang mit ozeandaten (netCDF). ich versuche gerade, thermoclines u.a. darzustellen.. im gegensatz zu ganzen karten, brauche ich hier ja eine konkrete ortsangabe (lat,lon).

ich habe die variablen

Code: Alles auswählen

	double lon(y, x) ;
		lon:long_name = "longitude" ;
		lon:units = "degrees_east" ;
		lon:standard_name = "longitude" ;
		lon:_CoordinateAxisType = "Lon" ;
	double lat(y, x) ;
		lat:long_name = "latitude" ;
		lat:units = "degrees_north" ;
		lat:standard_name = "latitude" ;
		lat:_CoordinateAxisType = "Lat" ;
und zum beispiel die variable 'potentielle Temperatur'

Code: Alles auswählen

	float tho(time, depth, y, x) ;
		tho:long_name = "Sea water potential temperature" ;
		tho:standard_name = "sea_water_potential_temperature" ;
		tho:units = "C" ;
		tho:code = 2 ;
		tho:coordinates = "lon lat" ;
		tho:_FillValue = -9.e+33f ;
um den ort genau zu bestimmen, hab ich die where() funktion in betracht gezogen und folgendes probiert

Code: Alles auswählen

import matplotlib as mpl
mpl.use('Qt4Agg')

import matplotlib.pyplot as plt
import numpy as np
import netCDF4
from netCDF4 import Dataset

# import data
infile = 'MeinDatensatz'

# open the data set
f = netCDF4.MFDataset(infile)


lons = f.variables['lon'][:,:]
lats = f.variables['lat'][:,:]

xx = np.where(lons == 65)
yy = np.where(lats == 15)

depth = f.variables['depth']
tho = f.variables['tho'][0,:,yy,xx]


figure1 = plt.figure()
ax1 = figure1.add_subplot(111)
ax1.plot(tho, depth, 'o-')

# draw x label
ax1.set_xlabel('Sea water potential temperature')
ax1.xaxis.set_label_position('top')
ax1.xaxis.set_ticks_position('top')

# draw y label
ax1.set_ylabel('depth')
ax1.set_ylim(ax1.get_ylim()[::-1])
nur:

Code: Alles auswählen

IndexError: Index cannot be multidimensional.
wie krieg ich das hin, dass ich nicht (time, depth, (y,x), (y,x)) habe, sondern nur (time,depth,y,x) für die gewünschten koordinaten? hab das nicht hingekriegt..

lieben dank im voraus für eure hilfe!
eisley
User
Beiträge: 8
Registriert: Dienstag 29. April 2014, 20:18

.. ich habe noch weiter probiert und habe nun folgendes:

Code: Alles auswählen

ii = np.where(lons == 90) and np.where(lats == 10)
nun habe ich noch das problem, wie ich diesen vektor in

Code: Alles auswählen

tho = f.variables['tho'][0,:,y,x]
bringe...
BlackJack

@eisley: Erkläre mal in Worten an was `ii` gebunden wird und wie das zustande kommt. Ich habe nämlich den starken Verdacht, dass Du ``and`` nicht richtig verstanden hast.
eisley
User
Beiträge: 8
Registriert: Dienstag 29. April 2014, 20:18

Hallo BlackJack

danke für deine antwort.. was ich möchte ist: zeige die pot. temperatur tho in allen tiefen am ort 10°N und 90°E. so wie die variablen gegeben sind, dachte ich mir, dass ich mit where() die bedingungen angeben kann und so den plot für genau diesen breiten- bzw. längengrad erhalte.

sprich die entsprechenden (y,x)-koordinaten..
BlackJack

@eisley: Das beantwortet die Frage nach dem `ii` nicht. Ich habe das Gefühl Du weisst nicht wie die Daten organisiert sind und welche Operationen auf Numpy-Arrays welche Ergebnisse liefern und probierst jetzt einfach wild herum. Das ist nicht wirklich zielführend.

Als erstes müsste man wohl klären wie die Eingabedaten überhaupt aussehen. Warum sind `lats` und `lons` jeweils zweidimensional? Das macht ja nur Sinn wenn beiden Arrays zusammengenommen ein 2D-Array mit Koordinaten ergeben die kein total regelmässiges ”Gitter” beschreiben, denn sonst wären die Informationen unnötig redundant.

Wenn es Koordinaten sind, die nicht regelmässig sind, dann müsste man entweder genau einen Punkt kennen, oder man müsste zum Punkt die Koordinate mit dem geringsten Abstand ermitteln, um die Indexkoordinaten zu bestimmen.
eisley
User
Beiträge: 8
Registriert: Dienstag 29. April 2014, 20:18

.. da hast du recht, ich bin noch etwas verloren. :| aber langsam kommts. ich habe gerade ein passendes paper gefunden, in welchem solche probleme beschrieben sind.

danke für deine ausführungen und ich kämpf mich vorerst noch einmal durch die theorie.
Antworten