Python: find position of element in array

PythonArraysNumpyIndexing

Python Problem Overview


I have a CSV containing weather data like max and min temperatures, precipitation, longitude and latitude of the weather stations etc. Each category of data is stored in a single column.

I want to find the location of the maximum and minimum temperatures. Finding the max or min is easy: numpy.min(my_temperatures_column)

How can I find the position of where the min or max is located, so I can find the latitude and longitude?

Here is my attempt:

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

I saved each of the columns of my CSV into variables, so they are all individual lists.

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 

I have resolved the problem as per the suggestion list.index(x)

mean_temp.index(coldest_temp) 

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

Unsure if asking a second question within a question is proper, but what if there are two locations with the same minimum temperature? How could I find both and their indices?

Python Solutions


Solution 1 - Python

Have you thought about using Python list's .index(value) method? It return the index in the list of where the first instance of the value passed in is found.

Solution 2 - Python

Without actually seeing your data it is difficult to say how to find location of max and min in your particular case, but in general, you can search for the locations as follows. This is just a simple example below:

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

Alternatively, you can also do as follows:

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

Solution 3 - Python

As Aaron states, you can use .index(value), but because that will throw an exception if value is not present, you should handle that case, even if you're sure it will never happen. A couple options are by checking its presence first, such as:

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

or by catching the exception as in:

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

You can never go wrong with proper error handling.

Solution 4 - Python

For your first question, find the position of some value in a list x using index(), like so:

x.index(value)

For your second question, to check for multiple same values you should split your list into chunks and use the same logic from above. They say divide and conquer. It works. Try this:

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

Hope that helps!

Solution 5 - Python

Suppose if the list is a collection of objects like given below:

obj =  [
        {

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

        }, 
        {
 
            "subjectId" : "56645cd63c43a07b61c2c650", 
            "subjectName" : ".NET",         
        }, 
        {
           
            "subjectId" : "5656a2ec3c43a07b61c2bd83", 
            "subjectName" : "Python",
            
        }, 
        {
 
            "subjectId" : "5662add93c43a07b61c2c58c", 
            "subjectName" : "HTML"
        }
    ]

You can use the following method to find the index. Suppose the subjectId is 5662add93c43a07b61c2c58c then to get the index of the object in the list,

subjectId = "5662add93c43a07b61c2c58c"

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

Solution 6 - Python

In the NumPy array, you can use where like this:

np.where(npArray == 20)

Solution 7 - Python

You should do:

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

Solution 8 - Python

There is a built in method for doing this:

numpy.where()

You can find out more about it in the excellent detailed documentation.

Solution 9 - Python

I would assume your variable mean_temp already has the values loaded in to it and is nX1 dimension (i.e only one row). Now to achieve what you want, you can :

Change the datatype of your 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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionjulesjankerView Question on Stackoverflow
Solution 1 - PythonAaronView Answer on Stackoverflow
Solution 2 - PythonMarcinView Answer on Stackoverflow
Solution 3 - PythonGary02127View Answer on Stackoverflow
Solution 4 - PythonkarlzafirisView Answer on Stackoverflow
Solution 5 - PythonHaris NpView Answer on Stackoverflow
Solution 6 - PythonAhad aghapourView Answer on Stackoverflow
Solution 7 - PythonsudhakarView Answer on Stackoverflow
Solution 8 - PythonlkololololView Answer on Stackoverflow
Solution 9 - PythonNishant DixitView Answer on Stackoverflow