我正在研究 Hans Petter Langtangen 的《A Primer on Scientific Programming with Python 2nd》一书。这本书使用python2,但我在python3中应用它。scotools.std 库在书中被广泛使用,但我无法在 python3 中导入或安装它。是否有适用于 python3 的 scitools.std 的替代品?(这可能会解决我看书的困难。)
特别是在这个问题中,我正在寻找 Easyviz 的替代方案,因为我无法通过根据问题中的需要修改参数 s 来制作具有高斯函数图的电影。
书中呈现的python2代码为:
from scitools.std import *
import time
def f(x, m, s):
return (1.0/(sqrt(2*pi)*s))*exp(-0.5*((x-m)/s)**2)
m = 0
s_start = 2
s_stop = 0.2
s_values = linspace(s_start,s_stop, 30)
x = linspace(m - 3*s_start, m + 3*s_start, 1000)
# f is max for x=m; smaller s gives larger max value
max_f = f(m, m s_stop)
# Show the movie on the screen
# and make hardcopies of frames simultaneously.
counter = 0
for s in s_values:
y = f(x, m, s)
plot(x, y, axis=[x[0], x[-1], -0.1, max_f],
xlabel='x', ylabel='f', legend='s=%4.2f' % s,
savefig='tmp%04d.png' % counter)
counter += 1
#time.sleep(0.2)
# Make movie file the simplest possible way:
movie('tmp*.png')
我在 python3 中的不完整版本是:
import time
import numpy as np
import matplotlib.pyplot as plt
def f(x, m, s):
return (1.0/(np.sqrt(2*np.pi)*s))*np.exp(-0.5*((x-m)/s)**2)
m = 0
s_start = 2
s_stop = 0.2
s_values = np.linspace(s_start, s_stop, 30)
x = np.linspace(m - 3*s_start, m + 3*s_start, 1000)
# f is max for x=m; smaller s gives larger max value
max_f = f(m, m, s_stop)
# Show the movie on the screen
# and make hardcopies of frames simultaneosly.
counter = 0
for s in s_values:
y = f(x, m, s)
plt.plot(x, y)
plt.xlim(x[0], x[-1])
plt.ylim(-0.1, max_f + 0.1)
plt.xlabel('x')
plt.ylabel('f')
plt.legend('s=%4.2f' % s)
plt.savefig('tmp%04d.png' % counter)
counter += 1
#time.sleep(0.2)
plt.show()
这会正确生成 30 张图像,但不会继续生成电影。*请注意,我使用 plt.show () 并且必须关闭 30 个窗口,如果我不使用每个生成的文件,它会在同一张图中显示累积曲线。
所以我看到了三种方法来解决我的问题:
1)能够正确安装和导入 scitools.std (这将是极好的,因为问题贯穿整本书!);
2) 获得 scitools.std 和 Easyviz 模块的替代方案;
3)按照我在不完整的代码版本中采用的路径,即用在我的代码中运行良好的东西替换书中提供的命令电影('tmp * .png')。