2014-12-02 12 views
10

Maksimum ve minimum sıcaklıklar, yağış, boylam ve hava istasyonları gibi enlem ve boylam bilgilerini içeren bir CSV hava durumu veriyorum. Her veri kategorisi tek bir sütunda saklanır.Python: dizideki öğenin konumunu bulma

Maksimum ve minimum sıcaklıkların yerini bulmak istiyorum. Maks veya dk değerini bulmak kolaydır: numpy.min (my_temperatures_column)

En az veya en büyük konumun konumunu nasıl bulabilirim, böylece enlem ve boylamı bulabilirim?

İşte benim girişimi:

def coldest_location(data): 

coldest_temp= numpy.min(mean_temp) 

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

Error: List indices must be int

deÄŸiÅŸkene benim CSV sütunlarının her kurtardı, bu yüzden tüm bireysel listeleri vardır.

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 

Ben öneri list.index uyarınca sorunu çözmüş (x)

mean_temp.index(coldest_temp) 

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

Emin bir soru içinde ikinci bir soru sorarak doğru ise, ancak iki konumları olduysa aynı minimum sıcaklık? Hem endeksleri hem de endekslerini nasıl bulabilirim?

+0

. 'Min' indeks numarasını bulabilir ve daha sonra enlem ve boylam listelerinde aynı konumda bulunan elemanları bulmak için bunu kullanabilirsiniz.Eğer 'csv' dosyanızın bir pasajını yapıştırabiliyorsanız – Beginner

+0

'u görmeniz daha kolay olacaktır. Olası kopyası [Listede bir liste nasıl alınır?] (Https://stackoverflow.com/questions/364621/how-to -get-items-in-a-list) –

cevap

27

Python listenin .index(value) yöntemi kullanarak düşündünüz mü? Dizini, value iletisinin ilk örneğinin bulunduğu listeden döndürür.

9

Gerçekten de verilerinizi görmeden, özel durumunuzda maks ve dk konumlarını nasıl bulacağınızı söylemek zordur, ancak genel olarak, konumları aşağıdaki gibi arayabilirsiniz. Alternatif

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]),) 

, aşağıdaki gibi de yapabilirsiniz: Bu, aşağıda sadece basit bir örnektir

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 
4

Aaron'un belirttiği gibi, .index(value)'u kullanabilirsiniz, ancak bu value yoksa bir istisna atar, çünkü bu durumun hiçbir zaman gerçekleşmeyeceğinden emin olmanız gerekir.

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

ya olduğu gibi istisna yakalayarak: Birkaç seçenekleri gibi ilk varlığını kontrol ederek vardır

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

Sen doğru hata işleme ile yanlış asla.

+0

İkinci sorunuz için bir "liste anlama" kullanabilirsiniz. Bunlar zor görünebilir, ama bir kez onları asmak, onlar çok kompakt kod için yaparlar. Sizin durumunuzda: '[i aralığında (len (my_list) için) my_list [i] == value]' talep edilen indekslerin bir listesini döndürür. Eşleşme yoksa liste boş olacak veya eşleşme varsa bir veya daha fazla öğeye sahip olacaktır. – Gary02127

3

Sen yapmalıdır:

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

Cevabınıza bir açıklama getirebilir misiniz lütfen? –

0

Ben senin değişken mean_temp varsayılabilir zaten kendisine yüklenen değerlere sahip ve Nx1 boyut (yani sadece bir satır) 'dir. Şimdi ne istediğinizi elde etmek için şunları yapabilirsiniz:

değiştirin değişkenin veri türü: Tüm veriler ayrı listelerde ise

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