【问题标题】:Python statement structurePython 语句结构
【发布时间】:2021-04-09 19:03:29
【问题描述】:

请考虑以下python代码

import matplotlib.pyplot as plt
import numpy as np

#创建一些数据来绘制。

dt = 0.001
t = np.arange(0.0,100,dt)
r = np.exp(-t[:1000]/0.05)
x = np.random.randn(len(t))
s = np.convolve(x,r)[:len(x)]*dt

代码编译并运行,我大致了解它在做什么。但是,我对代码 '[:len(x)]' 实际上在做什么感到困惑。如果我将 's' 截断为 'np.convolve(x,r)*dt',则代码无法编译,并且来自 'base.py' 的错误消息如下:

"raise ValueError(f"x 和 y 必须具有相同的第一维,但是 " ValueError: x 和 y 必须具有相同的第一个维度,但形状为 (100000,) 和 (100999,)"

'[:len(x)]' 实际上在做什么,语言文档中是否有一些内容提供了这种上下文的一些示例?

谢谢。

所有对象都是'ndarray'类型。 t 是长度 100000 t 的形状为 (100000,)

r is length  1000
r is of shape  (1000,) 

x is length  100000
x is of shape  (100000,) 

s is length  100999
s is of shape  (100999,) 

【问题讨论】:

  • [:len(x)] 只是说“从np.convolve 调用的结果中,只取第一个len(x) 元素,将它们乘以dt 并将结果向量存储在s 中。
  • 你有完全相同的概念 2 行:-t[:1000],它采用 t 的前 1,000 个元素并在计算中使用它们。这是同一件事。它叫做slice notation
  • 那么对于 'plt.plot(t,s)' ndarray 对象 't' 和 's' 必须具有相同的形状?那是100000?否则形状将分别为 100000 和 100999 ?在这种情况下,长度和形状似乎是一致的。
  • 是的。在这种情况下,ts 是绘图的 x 和 y 坐标。他们最好有相同的基数。没有y就不能有x。
  • 非常感谢。现在从图形 pov 看来很明显,但代码不是:-(

标签: python plot shapes


【解决方案1】:

如果我们阅读np.convolve 的文档,我们会看到使用默认参数时,它会返回一个比输入数组的长度总和短一个的数组。也就是说,如果您调用np.convolve(a, b),并且len(a) = A 和len(b) = B,则输出长度为A + B - 1。

这是因为卷积可以解释为对两个函数的乘积进行积分,其中一个函数相对于另一个函数移动。默认情况下,np.convolve 为这些函数重叠的所有点计算此卷积,因此输出的长度大约是输入函数长度的总和。在您的情况下,x 的长度为 100,000,r 的长度为 1,000,因此输出长度为 100,000 + 1,000 - 1 = 100,999。

您可以使用mode 参数更改此行为,以便np.convolve 自动截断输出,但两个替代选项似乎都不符合您的用例。您可以尝试提供mode = same,这可以确保输出与最长输入的长度相同,然后看看会发生什么符合您自己的兴趣。

由于 t - 长度 100,000 - 和 s 需要具有相同的长度,因此您可以绘制(我假设)s(t),因此您需要将输出 s 截断为 100,000 的长度以匹配。

这就是符号[:len(x)] 的作用。这称为"slice" notation,要点是A[start:stop] 允许您从start(包括)到stop(不包括)选择A 中的值子集。如果您不提供开始或结束,则它分别默认为数组的开始或结束。所以[:len(x)] 选择从 0 到 len(x)(不包括),这给你一个长度为len(x) 的数组。这确保了len(s) = len(x)

【讨论】:

  • 感谢您最周到的回复。它迫使我比我记得的更多地理解卷积的数学过程。当考虑一个函数门控另一个函数时的潜在边界效应时,我可以看到“模式”参数发挥了自己的作用。再次感谢。
猜你喜欢
  • 2015-07-26
  • 2014-09-05
  • 2013-04-10
  • 2017-07-17
  • 2018-12-06
  • 2011-02-02
  • 2011-03-21
  • 2014-11-09
  • 1970-01-01
相关资源
最近更新 更多