如何在python中计算数组的导数

时间:2013-05-30 16:47:54

标签: python python-2.7

如何计算数组的衍生物y(比方说)相对于另一个数组x(比方说) - 来自某个实验的两个数组?例如,y = [1,2,3,4,4,5,6]x = [.1,.2,.5,.6,.7,.8,.9];我想得到dy/dx

4 个答案:

答案 0 :(得分:14)

使用 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是您的数组/列表大小。

不知道你想要达到的目的,但这里有一些想法 如果你想numerical differentiation finite differences,那么forward schema of finite differences可能会更好地帮助你。 上面的解决方案类似于具有非均匀网格/阵列的{{3}}的一阶精度近似。

答案 1 :(得分:4)

我认为这就是你的意思:

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

也就是说,将dx定义为x中相邻元素之间的差异。

答案 2 :(得分:3)

使用var randNumber = this.random(); var pointerValue = (Math.floor(10 / randNumber) * 10) + pinValue ;

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

numpy.gradient

答案 3 :(得分:0)

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

现在您可以将这两个结果数组分开以获得所需的导数。

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