web-dev-qa-db-fra.com

Python: recherche la position d'un élément dans un tableau

J'ai un fichier CSV contenant des données météorologiques telles que les températures maximales et minimales, les précipitations, la longitude et la latitude des stations météorologiques, etc. Chaque catégorie de données est stockée dans une seule colonne. 

Je veux trouver l'emplacement des températures maximales et minimales. Trouver le max ou le min est facile: Numpy.min (my_temperatures_column)

Comment puis-je trouver la position du min ou du max afin de pouvoir trouver la latitude et la longitude?

Voici ma tentative: 

def coldest_location(data):

coldest_temp= numpy.min(mean_temp)

    for i in mean_temp:
         if mean_temp[i] == -24.6:
            print i

Erreur: les index de liste doivent être int

J'ai enregistré chacune des colonnes de mon fichier CSV dans des variables, de sorte qu'elles constituent toutes des listes individuelles.

lat          = [row[0] for row in weather_data]  # latitude
long         = [row[1] for row in weather_data]  # longitude
mean_temp    = [row[2] for row in weather_data]  # mean temperature 

J'ai résolu le problème selon la suggestion list.index (x)

mean_temp.index(coldest_temp) 

coldest_location=[long[5],lat[5]] 

Vous ne savez pas si poser une deuxième question à l'intérieur d'une question est approprié, mais que se passe-t-il s'il y a deux endroits avec la même température minimale? Comment pourrais-je trouver les deux et leurs indices? 

20
julesjanker

Avez-vous pensé à utiliser la méthode .index(value) de la liste Python? Il renvoie l'index dans la liste des endroits où se trouve la première instance de la value transmise.

45
Aaron

Sans voir réellement vos données, il est difficile de dire comment trouver l'emplacement de max et min dans votre cas particulier, mais vous pouvez généralement rechercher les emplacements comme suit. Ceci est juste un exemple simple ci-dessous:

In [9]: a=np.array([5,1,2,3,10,4])

In [10]: np.where(a == a.min())
Out[10]: (array([1]),)

In [11]: np.where(a == a.max())
Out[11]: (array([4]),)

Alternativement, vous pouvez également procéder comme suit:

In [19]: a=np.array([5,1,2,3,10,4])

In [20]: a.argmin()
Out[20]: 1

In [21]: a.argmax()
Out[21]: 4
13
Marcin

Comme le dit Aaron, vous pouvez utiliser .index(value), mais comme cela lève une exception si value n’est pas présent, vous devez gérer ce cas, même si vous êtes sûr que cela ne se produira jamais. Quelques options sont en vérifiant sa présence en premier, telles que:

if value in my_list:
    value_index = my_list.index(value)

ou en interceptant l'exception comme dans:

try:
    value_index = my_list.index(value)
except:
    value_index = -1

Vous ne pouvez jamais vous tromper en gérant correctement les erreurs.

5
Gary02127

Tu devrais faire:

try:
    value_index = my_list.index(value)
except:
    value_index = -1;
3
sudhakar

Il existe une méthode intégrée pour le faire:

numpy.where()

Vous pouvez en savoir plus à ce sujet dans la excellente documentation détaillée .

2
lkolololol

Je suppose que votre variable mean_temp a déjà les valeurs qui y sont chargées et qu’elle est une dimension nX1 (c’est-à-dire une seule ligne). Maintenant, pour réaliser ce que vous voulez, vous pouvez:

Changez le type de données de votre variable:

def coldest_location(data):

    mean_temp = numpy.mat(mean_temp) #data is now matrix type
    min_index = numpy.nonzero(mean_temp == mean_temp.min())  # this returns list of indexes
    print mean_temp[min_index[0],min_index[1]] # printing minimum value, i.e -24.6 in you data i believe
0
Nishant Dixit