【问题标题】:Implementing derivatives of logs of data in python在python中实现数据日志的派生
【发布时间】:2018-02-06 16:54:10
【问题描述】:

我们有两个数据列表(向量),yx,我们可以想象 x 是时间步长 (0,1,2,...) 和 y 一些系统属性计算在重视x.的每个值 我有兴趣计算ylog 相对于logx, 的导数,问题是如何在Python 中执行这样的计算? 我们可以从使用numpy 计算日志开始:logy = np.log(y)logx = np.log(x). 那么我们使用什么方法来区分 dlog(y)/dlog(x)?

想到的一个选项是通过以下方式使用np.gradient()

deriv = np.gradient(logy,np.gradient(logx)).

  • 这是进行此计算的有效方法吗?
  • 在不使用np.gradient 的情况下是否有更好(或等效)的替代方案?

【问题讨论】:

  • 您真的要计算时间列表的log() 吗?我认为这很不寻常。
  • @Alfe 这可能不常见但与实际问题无关,您可以将x 想象为任何向量。
  • np.gradient(logy, logx) 不是您要找的吗?
  • @Alfe 好吧,我将np.gradient(logx) 作为第二个参数,因为我们想要在微分过程中日志值之间的差异对吗?
  • np.gradient([0,1,2,3,4,5], [0, 1, 2, 3.5, 4, 5])array([1., 1., 0.8667, 1.6667, 1.6667, 1.]) 所以我想说gradient 应该收到日志,就是这样。

标签: python numpy derivative computation


【解决方案1】:

查看np.gradient here 的来源并环顾四周后,您可以看到它在 numpy 1.14 版中发生了变化,因此文档发生了变化。

我有 1.11 版。所以我认为如果isinstance(x, np.ndarray) 现在渐变定义为def gradient(y, x) -> dy/dx 但不在版本1.11 中。我认为,np.gradient(y, np.array(...)) 实际上是未定义的行为!

但是,np.gradient(y) / np.gradient(x) 适用于所有 numpy 版本。使用它!

证明:

import numpy as np
import matplotlib.pyplot as plt
x = np.sort(np.random.random(10000)) * 2 * np.pi
y = np.sin(x)
dy_dx = np.gradient(y) / np.gradient(x)
plt.plot(x, dy_dx)
plt.show()

看起来很像 cos

【讨论】:

  • 我有版本1.12,实际上版本问题对我来说一直是问题的根源,参见例如stackoverflow.com/questions/48171283/…
  • 一个问题是np.gradient() 要求我们传递的第二个参数 (dx) 是标量,因为它给出了错误:distances must be scalars. 所以事实上我无法让np.gradient(logy,np.gradient(logx)) 工作因为它会导致崩溃(假设我们已经记录了数据,logx 及其梯度都是整数)。这就是为什么在这篇文章中我主要对替代方法感兴趣,可能会使用除 numpy 之外的其他库来实现这些目的。
  • 对,所以使用np.gradient(np.log(y)) / np.gradient(np.log(x))
  • 好的,这真的给你和np.gradient(logy,np.gradient(logx))一样的结果吗?
  • 是的。这打印True:y = np.random.random(20); x = np.random.random(20); new_dy_dx = np.gradient(y, np.gradient(x)); old_dy_dx = np.gradient(y) / np.gradient(x); print(np.isclose(new_dy_dx, old_dy_dx).all())
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
  • 1970-01-01
相关资源
最近更新 更多