【问题标题】:Multiple maximums in an interval一个区间内的多个最大值
【发布时间】:2021-10-15 15:02:43
【问题描述】:

我认为我正在尝试做的事情在理论上应该很简单,但我就是不知道该怎么做。顺便说一句,在我开始之前,我应该先说我只允许自己使用scipynumpy。 (所以更重要的是我不允许使用pandas

我有这个csv list 和列名'Latitude','Longitude','Time','Quantity'(只是一个sn-p,这个列表很大,有很多年),我想做的是每年找到最大的纬度。我很难区分每年最大的元素。这是我用于分隔列的代码

def read_file(x):
    # Reads the file and returns the 4 columns of datapoints as lists.
    data=np.genfromtxt(x, delimiter=',',usecols=range(4),dtype=None,unpack=True,names=True,encoding=None)
    date,time=np.genfromtxt(data['Time'],delimiter='T',dtype=None,unpack=True,encoding=None)
    year,month,day=np.genfromtxt(date,delimiter='-',dtype=None,unpack=True)
    return year,data['Latitude'] 
# I'm just returning the important things for now
# but the plan is to use all of the data for later tasks

计划是创建另一个函数来查找当前元素是否与前一个元素相同:

def max_per_year(x):
   year,lat=read_file(x)
   for i in range(len(year):
      if year[i]==year[i-1]:

这就是我无法弄清楚如何让它通过以前的is 看到的地方,直到它再次不同。

【问题讨论】:

  • 为什么不直接使用 max(lat) 而不是 for 循环?
  • 因为那我只能得到最大纬度?我想要每年的最大纬度,澄清一下,“时间”列的格式如下“YYYY-MM-DDThh:mm:ss.000000Z”(不要问我为什么),我已经将年份提取到它自己的数组中,它只是给了我一个包含很多重复年份的列表,并且我已经为 lat 制作了另一个具有相同维度的数组(如果它有助于解决我的问题,我可以将它们组合起来)对应到那个日期的纬度。
  • 您可以使用字典,其中年份是键,值是当前最大值,然后当您在 for 循环中迭代时,只需检查给定年份的当前值是否大于存储的字典中的值。然后在循环之后返回字典。
  • this 是我的尝试,正如您从 max(lat) 看到的那样,由于某种原因不起作用,我实际上不知道为什么?编辑:好的,我现在完全意识到 elif 语句需要返工,我只是通过这种方式获得重复的年份,但无论哪种方式,我眼中最重要的应该工作但不是?跨度>
  • 当你做year,lat=read_file(x)时,yearlat的值是多少?我的意思是它们的类型和含义是什么?看起来两者都是numpy数组。那么year[i] 是一年吗,比如1999lat[i] 那一年的“纬度”?同一年会在year 中出现多次吗?我假设是这样,因为您正在寻找最大值。我问这一切是因为下面@Fermi-4 答案的替代解决方案是划分每年的“纬度”值。然后你可以直接在每个单独的“lat”值列表上使用max()

标签: python list numpy scipy


【解决方案1】:

让我们思考一下这段代码在做什么......

def max_per_year(x):
    latdic={}
    year,lat=read_file(x)
    for i in range(len(year)):
        if year[i]==year[i-1]:
            if float(lat[i]) >=float(lat[i-1]):
                latdic[str(year[i])]=lat[i]
        elif year[i]!=year[i-1]:
            latdic[str(year[i])]=lat[i]
    return latdic, max(lat)

特别看一下这个条件:if float(lat[i]) >=float(lat[i-1]) - 它会用前一个 lat 评估每个 lat,如果更大,则替换当前的 max。

因此,如果我有一个数组 [10, 1, 2],那么当您需要 10 时,此逻辑将返回 2 作为最大数。您需要做的是与 current max 进行比较,而不是与之前的索引进行比较。

此外,您可以完全放弃年份比较,因为它只是键值对中的一个键。

想一想 - 当您位于数组的开头时,[i-1] 的计算结果是什么?

试试这样的:

def max_per_year(x):
    latdic={}
    year,lat=read_file(x)
    for i in range(len(year)):
        # at least one entry exist for year[i]
        if year[i] in latdic:
            # an entry exists, now check if current entry is less than lat[i]
            if latdic[year[i]] < lat[i]:
                latdic[year[i]]=lat[i]
        # no entry for year[i] key
        else:
            latdic[year[i]]=lat[i]
    return latdic

【讨论】:

  • 它没有评估为假,它给了我if latdic[year[i]]: KeyError: 2021 但否则这比我的代码更有意义!感谢您的帮助,但是如何解决第一次进入问题?
  • 是的,你是对的 - 我更新了答案以正确检查密钥是否存在。
  • 非常感谢!问题已经解决了!虽然我必须承认我对为什么将 if lat[year[i]: 更改为 if year[i] in latdic: 修复了检查这些不一样的原因感到困惑?
  • 没问题。那是我的错 - 在这里背诵,只是语法错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
相关资源
最近更新 更多