【问题标题】:How do I compute the derivative of an array in python如何在python中计算数组的导数
【发布时间】:2021-07-23 11:21:22
【问题描述】:

我如何计算一个数组的导数,y(比方说),相对于另一个数组,x(比方说)——来自某个实验的两个数组?

例如

y = [1,2,3,4,4,5,6]x = [.1,.2,.5,.6,.7,.8,.9];

我想得到dy/dx

【问题讨论】:

  • 函数有导数,而不是值集。如果我们定义了一个函数dydx(x=[.1,.2,.5,.6,.7,.8,.9], y=[1,2,3,4,4,5,6]),你希望返回值是什么样的?
  • 你想计算导函数吗?还是只是给定间隔内的值?
  • 在你的情况下,它看起来像 y = 10x => 衍生是 y=10 我想......我不确定我是否理解了这个问题
  • Dy / dx 表示 Y 的差异,除以 X 的差异,也称为 (x_1, y_1) 和 (x_2, y_2) 两点之间的斜率。只需减去y[]中的两个相邻元素,然后除以x[]中两个对应元素的差即可。

标签: python


【解决方案1】:

使用numpy.diff

如果 dx 是常数

from numpy import diff
dx = 0.1
y = [1, 2, 3, 4, 4, 5, 6]
dy = diff(y)/dx
print dy 
array([ 10.,  10.,  10.,   0.,  10.,  10.])

dx 不是常数(你的例子)

from numpy import diff
x = [.1, .2, .5, .6, .7, .8, .9]
y = [1, 2, 3, 4, 4, 5, 6]
dydx = diff(y)/diff(x)
print dydx 
[10., 3.33333,  10. ,   0. , 10. ,  10.]

请注意,这个近似的“导数”大小为n-1,其中n 是您的数组/列表大小。

不知道你想要达到什么目的,但这里有一些想法:

【讨论】:

    【解决方案2】:

    使用numpy.gradient()

    请注意,有比简单地使用diff 更高级的方法来计算数值导数。我建议使用numpy.gradient,就像在这个例子中一样。

    import numpy as np
    from matplotlib import pyplot as plt
    
    # we sample a sin(x) function
    dx = np.pi/10
    x = np.arange(0,2*np.pi,np.pi/10)
    
    # we calculate the derivative, with np.gradient
    plt.plot(x,np.gradient(np.sin(x), dx), '-*', label='approx')
    
    # we compare it with the exact first derivative, i.e. cos(x)
    plt.plot(x,np.cos(x), label='exact')
    plt.legend()
    

    【讨论】:

      【解决方案3】:

      我假设这就是你的意思:

      >>> from __future__ import division
      >>> x = [.1,.2,.5,.6,.7,.8,.9]
      >>> y = [1,2,3,4,4,5,6]
      >>> from itertools import izip
      >>> def pairwise(iterable): # question 5389507
      ...     "s -> (s0,s1), (s2,s3), (s4, s5), ..."
      ...     a = iter(iterable)
      ...     return izip(a, a)
      ... 
      >>> for ((a, b), (c, d)) in zip(pairwise(x), pairwise(y)):
      ...   print (d - c) / (b - a)
      ... 
      10.0
      10.0
      10.0
      >>>
      

      question 5389507 link

      即定义dxx中相邻元素之间的差异。

      【讨论】:

      • 我和其他人一样喜欢函数式编程,但这个答案太复杂了。
      • 这会计算所有其他差异,这显然不是问题所要求的。如果您想在考虑到 OP 的成功性的情况下“清楚地”进行辩论,请注意这个答案并没有处理 x 和 y 在他的问题中有奇数个元素的事实。使用 np.diff 的答案是正确的。
      【解决方案4】:

      numpy.diff(x) 计算

      x中相邻元素的差异

      就像@tsm 的回答一样。 结果,您得到一个比原始数组短 1 个元素的数组。这当然是有道理的,因为您只能开始计算与第一个索引的差异(需要 1 个“历史元素”)。

      >>> x = [1,3,4,6,7,8]
      >>> dx = numpy.diff(x)
      >>> dx
      array([2, 1, 2, 1, 1])
      
      >>> y = [1,2,4,2,3,1]
      >>> dy = numpy.diff(y)
      >>> dy
      array([ 1,  2, -2,  1, -2])
      

      现在您可以将这 2 个结果数组相除以获得所需的导数。

      >>> d = dy / dx
      >>> d
      array([ 0.5,  2. , -1. ,  1. , -2. ])
      

      如果由于某种原因,您需要相对(相对于 y 值)增长,您可以通过以下方式进行:

      >>> d / y[:-1]
      array([ 0.5       ,  1.        , -0.25      ,  0.5       , -0.66666667])
      

      解释为50%增长、100%增长、-25%增长等

      完整代码:

      import numpy
      x = [1,3,4,6,7,8]
      y = [1,2,4,2,3,1]
      dx = numpy.diff(x)
      dy = numpy.diff(y)
      d = dy/dx
      

      【讨论】:

      • 请提供某种解释以及代码。
      • 虽然这可能是一个有效的答案,但如果您详细说明这一点会更好,以便功能访问者可以从中学习。
      • @Pablo 请阅读this meta。虽然只有代码的答案不是很好,但它们通常也不应该被删除
      • @Machavity 谢谢你的链接,我会记住的。
      • 感谢@Nick 通知我。我更新了我的答案,希望它有意义。
      猜你喜欢
      • 2021-02-25
      • 2021-08-09
      • 2017-12-23
      • 2017-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 2017-07-16
      相关资源
      最近更新 更多