J'ai un tableau représentant les valeurs de la concentration d'eau dans les nuages dans un espace tridimensionnel. Aux endroits où la concentration de l'eau des nuages est au-dessus d'un certain seuil, je dis que j'ai un nuage (voir la section ci-dessous). La majeure partie du domaine est sèche, mais il y a un nuage de stratocumulus sur la majeure partie du domaine avec une base à environ 400 mètres.Extraction des indices d'une entité à partir d'un tableau multidimensionnel
Ce que je veux faire est extrait (x, y, z) les coordonnées de la base des nuages et du sommet des nuages. Ensuite, je veux utiliser ces coordonnées sur un tableau tridimensionnel différent représentant la composante verticale de la vitesse du vent pour obtenir le courant ascendant à la base du nuage. Ce que je fais maintenant fonctionne mais il est lent. Je me sens comme il doit y avoir un moyen de tirer parti de NumPy pour l'accélérer.
C'est ce que je fais maintenant:
# 3d array representing cloud water at a particular timestep t
qc = QC(t)
# get the coordinates where there is cloud
cloud_coords = argwhere(qc > qc_thresh)
# Arrays to hold the z values of cloud base (cb) and cloud top (ct)
zcb = zeros((nx,ny))
zct = zeros((nx,ny))
# Since each coordinate (x,y) will in general have multiple z values
# for cloud I have to loop over all (x,y) and
# pull out max and min height for each point (x,y)
for x in range(nx):
# Pull out all the coordinates with a given x value
xslice = cloud_coords[ where(cloud_coords[:,0] == x) ]
for y in range(ny):
# for the given x value select a particular y value
column = xslice[ where(xslice[:,1] == y) ]
try:
zcb[x,y] = min(column[:,2])
zct[x,y] = max(column[:,2])
except:
# Because there may not be any cloud at all
# (a "hole") we fill the array with an average value
zcb[x,y] = mean(zcb[zcb.nonzero()])
zct[x,y] = mean(zct[zct.nonzero()])
# Because I intend to use these as indices I need them to be ints
zcb = array(zcb, dtype='int')
zct = array(zct, dtype='int')
La sortie est un tableau à deux dimensions contenant les coordonnées z de la base des nuages (et haut)
J'utilise ensuite ces indices sur un autre tableau pour obtenir des variables comme la vitesse du vent à la base du nuage:
wind = W(t)
j,i = meshgrid(arange(ny),arange(nx))
wind_base = wind[i,j,zcb]
Je le fais pour plusieurs timesteps dans la simulation et la partie la plus lente est la boucle python sur toutes les coordonnées (x, y). Toute aide sur l'utilisation de NumPy pour extraire ces valeurs plus rapidement serait grandement appréciée!