it-swarm.com.de

Python: Position des Elements im Array suchen

Ich habe ein CSV, das Wetterdaten wie maximale und minimale Temperaturen, Niederschlag, Länge und Breitengrad der Wetterstationen usw. enthält. Jede Datenkategorie wird in einer einzigen Spalte gespeichert. 

Ich möchte den Ort der maximalen und minimalen Temperaturen finden. Das Maximum oder Min zu finden ist einfach: Numpy.min (my_temperatures_column)

Wie kann ich die Position finden, an der sich die Min- oder Max-Position befindet, sodass ich den Längen- und Breitengrad finden kann?

Hier ist mein Versuch: 

def coldest_location(data):

coldest_temp= numpy.min(mean_temp)

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

Fehler: Listenindizes müssen int sein

Ich habe jede der Spalten meiner CSV in Variablen gespeichert, sodass es sich um Einzellisten handelt.

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 

Ich habe das Problem gemäß dem Vorschlag list.index (x) gelöst.

mean_temp.index(coldest_temp) 

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

Unsicher, ob es richtig ist, eine zweite Frage innerhalb einer Frage zu stellen, aber was ist, wenn es zwei Standorte mit derselben Mindesttemperatur gibt? Wie kann ich beide und ihre Indizes finden? 

20
julesjanker

Haben Sie über die Verwendung der Python-Liste .index(value) nachgedacht? Sie gibt den Index in der Liste zurück, in der die erste übergebene Instanz von value gefunden wird.

45
Aaron

Wenn Sie Ihre Daten nicht wirklich sehen, ist es schwierig zu sagen, wie Sie die Position von max und min in Ihrem speziellen Fall ermitteln können. Im Allgemeinen können Sie die Positionen jedoch wie folgt suchen. Dies ist nur ein einfaches Beispiel:

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

Alternativ können Sie auch wie folgt vorgehen:

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

Wie Aaron sagt, können Sie .index(value) verwenden, da dies jedoch eine Ausnahme auslösen würde, wenn value nicht vorhanden ist, sollten Sie diesen Fall behandeln, selbst wenn Sie sicher sind, dass dies niemals passieren wird. Ein paar Optionen sind, indem Sie zuerst die Anwesenheit prüfen, wie zum Beispiel:

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

oder indem Sie die Ausnahme wie in:

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

Mit der korrekten Fehlerbehandlung können Sie niemals einen Fehler machen.

5
Gary02127

Du solltest tun:

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

Dafür gibt es eine integrierte Methode:

numpy.where()

Mehr dazu erfahren Sie in der exzellente ausführliche Dokumentation .

2
lkolololol

Ich würde davon ausgehen, dass Ihre Variable mean_temp bereits die Werte geladen hat und die Dimension nX1 hat (d. H. Nur eine Zeile). Jetzt können Sie erreichen, was Sie möchten:

Ändern Sie den Datentyp Ihrer Variablen:

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

Angenommen, die Liste besteht aus einer Sammlung von Objekten wie folgt:

obj =  [
        {

            "subjectId" : "577a54c09c57916109142248", 
            "evaluableMaterialCount" : 0, 
            "subjectName" : "ASP.net"

        }, 
        {

            "subjectId" : "56645cd63c43a07b61c2c650", 
            "subjectName" : ".NET",         
        }, 
        {

            "subjectId" : "5656a2ec3c43a07b61c2bd83", 
            "subjectName" : "Python",

        }, 
        {

            "subjectId" : "5662add93c43a07b61c2c58c", 
            "subjectName" : "HTML"
        }
    ]

Mit der folgenden Methode können Sie den Index ermitteln. Angenommen, die subjectId ist 5662add93c43a07b61c2c58c, um den Index des Objekts in der Liste abzurufen.

subjectId = "5662add93c43a07b61c2c58c"

for i, subjobj in enumerate(obj):
    if(subjectId == subjobj['subjectId']):
        print(i)
0
Haris Np

Suchen Sie für Ihre erste Frage die Position von Wert in einer Liste x mit index (), wie folgt:

x.index(value)

Um in Ihrer zweiten Frage nach mehreren gleichen Werten zu suchen, sollten Sie Ihre Liste in Blöcke aufteilen und dieselbe Logik wie oben verwenden. Sie sagen teilen und siegen. Es klappt. Versuche dies:

value = 1 
x = [1,2,3,4,5,6,2,1,4,5,6]

chunk_a = x[:int(len(x)/2)] # get the first half of x 
chunk_b = x[int(len(x)/2):] # get the rest half of x

print(chunk_a.index(value))
print(chunk_b.index(value))

Ich hoffe, das hilft!

0
喬治扎菲