Python 语句结构

Python statement structure

请考虑以下python代码

import matplotlib.pyplot as plt
import numpy as np

#create some data to plot.

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

如果我们阅读 np.convolve 的文档,我们会看到使用默认参数时,它 returns 是一个比输入数组长度之和短的数组。也就是说,如果您调用 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] 允许您 select A 中从 start(包含)到 stop(不包含)的值的子集).如果您不提供开始或结束,则它分别默认为数组的开始或结束。所以 [:len(x)] 从 0 到 len(x)(不包括)中选择,这给你一个长度为 len(x) 的数组。这确保 len(s) = len(x).