Python: vind positie van element in array

Ik heb een CSV met weergegevens zoals max. en min. temperaturen, neerslag, lengte- en breedtegraad van de weerstations enz. Elke categorie gegevens wordt opgeslagen in een enkele kolom.

Ik wil de locatie van de maximum- en minimumtemperaturen vinden. Het vinden van de max of min is eenvoudig:
numpy.min(my_temperatures_column)

Hoe kan ik de positie vinden waar de min of max zich bevindt, zodat ik de breedte- en lengtegraad kan vinden?

Hier is mijn poging:

def coldest_location(data):
coldest_temp= numpy.min(mean_temp)
    for i in mean_temp:
         if mean_temp[i] == -24.6:
            print i

Fout: Lijstindexen moeten int zijn

Ik heb elk van de kolommen van mijn CSV opgeslagen in variabelen, dus het zijn allemaal individuele lijsten.

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 

Ik heb het probleem opgelost volgens de suggestie list.index(x)

mean_temp.index(coldest_temp) 
coldest_location=[long[5],lat[5]] 

Weet u niet zeker of het correct is om een tweede vraag binnen een vraag te stellen, maar wat als er twee locaties zijn met dezelfde minimumtemperatuur? Hoe kan ik beide en hun indexen vinden?


Antwoord 1, autoriteit 100%

Heb je erover nagedacht om .index(value)methode? Het retourneert de index in de lijst van waar de eerste instantie van de valuedie is doorgegeven, wordt gevonden.


Antwoord 2, autoriteit 23%

Zonder uw gegevens daadwerkelijk te zien, is het moeilijk te zeggen hoe u de locatie van max en min in uw specifieke geval kunt vinden, maar over het algemeen kunt u als volgt naar de locaties zoeken. Dit is slechts een eenvoudig voorbeeld hieronder:

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

U kunt ook als volgt doen:

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

Antwoord 3, autoriteit 13%

Zoals Aaron stelt, kun je .index(value)gebruiken, maar omdat dat een uitzondering zal veroorzaken als valueniet aanwezig is, moet je dat geval afhandelen, zelfs als je zeker weet dat het nooit zal gebeuren. Een paar opties zijn door eerst de aanwezigheid ervan te controleren, zoals:

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

of door de uitzondering te vangen zoals in:

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

Je kunt nooit fout gaan met de juiste foutafhandeling.


Antwoord 4, autoriteit 2%

Er is een ingebouwde methode om dit te doen:

numpy.where()

Je kunt er meer over vinden in de uitstekend gedetailleerde documentatie.


Antwoord 5

Je moet doen:

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

Antwoord 6

Stel dat de lijst een verzameling objecten is zoals hieronder weergegeven:

obj =  [
        {
            "subjectId" : "577a54c09c57916109142248", 
            "evaluableMaterialCount" : 0, 
            "subjectName" : "ASP.net"
        }, 
        {
            "subjectId" : "56645cd63c43a07b61c2c650", 
            "subjectName" : ".NET",         
        }, 
        {
            "subjectId" : "5656a2ec3c43a07b61c2bd83", 
            "subjectName" : "Python",
        }, 
        {
            "subjectId" : "5662add93c43a07b61c2c58c", 
            "subjectName" : "HTML"
        }
    ]

U kunt de volgende methode gebruiken om de index te vinden. Stel dat de subjectId 5662add93c43a07b61c2c58c is om de index van het object in de lijst te krijgen,

subjectId = "5662add93c43a07b61c2c58c"
for i, subjobj in enumerate(obj):
    if(subjectId == subjobj['subjectId']):
        print(i)

Antwoord 7

Zoek voor je eerste vraag de positie van een waardein een lijst xmet index(), zoals:

x.index(value)

Voor uw tweede vraag, om te controleren op meerdere dezelfde waarden, moet u uw lijst in stukken splitsen en dezelfde logica van boven gebruiken. Verdeel en heers zeggen ze. Het werkt. Probeer dit:

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

Hopelijk helpt dat!


Antwoord 8

Ik neem aan dat je variabele mean_temp al de waarden bevat en nX1 dimensie heeft (d.w.z. slechts één rij). Om nu te bereiken wat u wilt, kunt u:

Wijzig het datatype van uw variabele:

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

Antwoord 9

In de NumPy-array kun je waar als volgt gebruiken:

np.where(npArray == 20)

Other episodes