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)
.
请考虑以下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)
.