Python:在数组中找到元素的位置

时间:2014-12-02 23:13:35

标签: python arrays numpy indexing

我有一个CSV,其中包含气象站的最高和最低温度,降水量,经度和纬度等天气数据。每种类别的数据都存储在一个列中。

我想找到最高和最低温度的位置。找到最大值或最小值很容易: numpy.min(my_temperatures_column)

如何找到最小值或最大值所在的位置,以便找到纬度和经度?

这是我的尝试:

def coldest_location(data):

coldest_temp= numpy.min(mean_temp)

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

错误:列表索引必须为int

我将CSV的每一列保存到变量中,因此它们都是单独的列表。

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 

我已根据建议list.index(x)

解决了问题
mean_temp.index(coldest_temp) 

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

不确定在问题中询问第二个问题是否合适,但如果有两个位置具有相同的最低温度怎么办?我怎么能找到它们和它们的指数?

9 个答案:

答案 0 :(得分:50)

您是否考虑过使用Python list的.index(value)方法?它返回传入value的第一个实例的列表中的索引。

答案 1 :(得分:13)

如果没有实际查看您的数据,很难说如何在特定情况下找到max和min的位置,但一般情况下,您可以按如下方式搜索位置。这只是一个简单的例子:

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

或者,您也可以执行以下操作:

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

答案 2 :(得分:8)

正如Aaron所说,你可以使用.index(value),但因为如果value不存在会引发异常,你应该处理这种情况,即使你确定它永远不会发生。有两种选择是首先检查它的存在,例如:

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

或通过捕获例外:

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

正确的错误处理永远不会出错。

答案 3 :(得分:3)

你应该这样做:

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

答案 4 :(得分:2)

有一个内置的方法可以做到这一点:

numpy.where()

您可以在excellent detailed documentation中找到有关它的更多信息。

答案 5 :(得分:0)

我认为你的变量mean_temp已经加载了它的值并且是nX1维度(即只有一行)。现在要实现你想要的,你可以:

更改变量的数据类型:

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

答案 6 :(得分:0)

假设列表是如下所示的对象集合:

obj =  [
        {

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

        }, 
        {

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

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

        }, 
        {

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

您可以使用以下方法找到索引。假设subjectId为5662add93c43a07b61c2c58c,然后获取该对象在列表中的索引,

subjectId = "5662add93c43a07b61c2c58c"

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

答案 7 :(得分:0)

对于第一个问题,使用index()在列表 x 中找到某个的位置,如下所示:

x.index(value)

对于第二个问题,要检查多个相同的值,应将列表分成多个块,并使用上面的相同逻辑。他们说分而治之。有用。试试这个:

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

希望有帮助!

答案 8 :(得分:0)

在 NumPy 数组中,你可以像这样使用 where:

np.where(npArray == 20)