【问题标题】:Find the points with the steepest slope python找到坡度最陡的点python
【发布时间】:2016-07-08 18:01:54
【问题描述】:

我有一个浮点列表,例如[x1,x2,x3,x4,....xn],它们被绘制为折线图。我想找到坡度最陡的一组点。

现在,我正在计算循环中一组点之间的差异,并使用max() 函数来确定最大点。

还有其他优雅的方法吗?

【问题讨论】:

  • 如果你的点是等距的(或假设是等距的)你的方法是尽可能优雅的。问题是你的代码有多优雅。
  • 目前,我的做法如下for i in range(len(list)): slope.append(list[i] - list[i+1]) print(slope.index(max(slope))),其中斜率是差异列表,列表是浮点数的原始列表
  • 将你的列表变成一个numpy数组并使用numpy.diff可能会感觉更优雅。 (例如,代码类似于steepest = np.argmax(np.diff(np.array(my_list)))
  • @Mechanic 顺便说一句,您的代码无法运行。你得到一个索引错误。
  • @Ev.Kounis 抱歉。第一行应该是for i in range(len(list)-1)。忘记加-1

标签: python


【解决方案1】:

假设points 是您的值列表,您可以使用以下方法计算单行中的差异:

max_slope = max([x - z for x, z in zip(points[:-1], points[1:])])

但是你获得的紧凑性,你可能会失去可读性。

在此列表理解中发生的情况如下:

  • 在原始列表的基础上创建了两个列表,即points[:-1] & points[1:]Points[:-1] 从原始列表的开头开始,到倒数第二个项目(包括)。 Points[1:] 从第二项开始,一直到最后一项(再次包含)

例子

example_list = [1, 2, 3, 4, 5]
ex_a = example_list[:-1]  # [1, 2, 3, 4]
ex_b = example_list[1:]   # [2, 3, 4, 5]
  • 然后您压缩这两个列表创建一个对象,您可以从中绘制 x、z 对来计算您的差异。请注意,zip 不会在 Python 3 中创建列表,因此您需要将其返回值传递给 list 参数。

喜欢:

example_list = [1, 2, 3, 4, 5]
ex_a = example_list[:-1]  # [1, 2, 3, 4]
ex_b = example_list[1:]   # [2, 3, 4, 5]
print(list(zip(ex_a, ex_b)))  # [(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
  • 最后,您使用创建的对计算差异,将结果存储在列表中并获取最大值。

如果最大坡度的位置也很有趣,您可以使用.index() 方法从创建的列表中获取索引。不过,在这种情况下,最好保存由推导式创建的列表,而不仅仅是使用它。

【讨论】:

    【解决方案2】:

    Numpy 有许多用于处理数组的工具。例如,您可以:

    import numpy as np
    
    xx = np.array([x1, x2, x3, x4, ...])  # your list of values goes in there
    print(np.argmax(xx[:-1] - xx[1:]))  # for all python versions
    

    【讨论】:

    • 你不需要 numpy 来摆脱 for 循环,但这个解决方案也很优雅。
    猜你喜欢
    • 2021-09-19
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 2019-12-29
    • 1970-01-01
    相关资源
    最近更新 更多