【问题标题】:Python: find position of element in arrayPython:查找数组中元素的位置
【发布时间】:2015-01-31 08:55:44
【问题描述】:

我有一个 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]] 

不确定在一个问题中提出第二个问题是否合适,但如果有两个位置的最低温度相同怎么办?我怎样才能找到两者及其索引?

【问题讨论】:

  • 如果您的所有数据都在单独的列表中。您可以找到min 的索引号,然后使用它来查找出现在经度和纬度列表中相同位置的元素。如果您可以粘贴您的csv 文件的 sn-p,它会更容易看到

标签: python arrays numpy indexing


【解决方案1】:

你有没有想过使用 Python 列表的 .index(value) 方法?它返回在列表中找到第一个传入的value 实例的索引。

【讨论】:

  • 当在 for 循环中访问这些索引时,当遍历相关错误(python 3)时,这似乎不起作用。就像给其他人的注释一样(我赞成这个答案)。
  • @cslotty 你能找到在循环中运行索引的解决方案吗?
  • @lampre409 如果我猜对了,您可以使用枚举函数:programiz.com/python-programming/methods/built-in/enumerate
【解决方案2】:

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

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

【讨论】:

【解决方案3】:

正如 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

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

【讨论】:

  • 对于第二个问题,您可以使用“列表理解”。这些可能看起来很棘手,但是一旦你掌握了它们,它们就会产生非常紧凑的代码。在您的情况下:[i for i in range(len(my_list)) if my_list[i] == value] 将返回请求的索引列表。如果没有匹配项,列表将为空,如果有匹配项,则列表将包含一个或多个元素。
  • 您的答案可以通过指定缺失值将导致ValueError 被抛出来改进,因此您应该专门except ValueError:
【解决方案4】:

对于您的第一个问题,使用 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))

希望有帮助!

【讨论】:

    【解决方案5】:

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

    np.where(npArray == 20)
    

    【讨论】:

      【解决方案6】:

      你应该这样做:

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

      【讨论】:

      • 你能解释一下你的答案吗?
      【解决方案7】:

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

      numpy.where()
      

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

      【讨论】:

        【解决方案8】:

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

        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)
        

        【讨论】:

          【解决方案9】:

          我会假设您的变量 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
          

          【讨论】:

            猜你喜欢
            • 2018-10-20
            • 1970-01-01
            • 1970-01-01
            • 2022-06-19
            • 1970-01-01
            • 2022-11-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多