Python np.分段返回常数值

Python np.分段返回常数值,python,numpy,Python,Numpy,我有两个数组,x和y,它们存储阶跃函数的值,即从某个x位置开始,y具有某个值。 在我下面的示例中,函数应该是0到10之间的零,1从10到20之间的零,依此类推 现在,我想插值,这样我可以绘制它。结果应该是一个10乘以0的数组,然后是10乘以1,等等。但是,我得到的是最后一个值的常量值。我做错了什么 import matplotlib.pyplot as plt import numpy as np # points for the step function x = np.arange(0,

我有两个数组,
x
y
,它们存储阶跃函数的值,即从某个
x
位置开始,
y
具有某个值。 在我下面的示例中,函数应该是0到10之间的零,1从10到20之间的零,依此类推

现在,我想插值,这样我可以绘制它。结果应该是一个10乘以0的数组,然后是10乘以1,等等。但是,我得到的是最后一个值的常量值。我做错了什么

import matplotlib.pyplot as plt
import numpy as np

# points for the step function
x = np.arange(0, 100, 10)
y = np.arange(len(x))
# points to evaluate at
x2 = np.arange(0, 100, 1)
# boolean matrix where to evaluate which function
tf = [((x2 >= z[0]) & (x2 < z[1])) for z in np.c_[x,np.append(x, 999999999)[1:]]]
# functions to evaluate at the corresponding regions
fs = [lambda x: n for n in y]
y2 = np.piecewise(x2, tf, fs)

# plot
fig, ax = plt.subplots()
ax.plot(x, y)   # this should be a straight line --> CORRECT
ax.plot(x2, y2) # this should look like stairs --> NOT CORRECT, CONSTANT = 9
导入matplotlib.pyplot作为plt
将numpy作为np导入
#阶跃函数的点
x=np.arange(0,100,10)
y=np.arange(len(x))
#评估点
x2=np.arange(0,100,1)
#布尔矩阵在哪里计算哪个函数
np.c_ux,np.append(x,999999999)[1:]]中的z的tf=[((x2>=z[0])和(x2正确
ax.plot(x2,y2)#这应该像楼梯-->不正确,常数=9

这是一个典型的新手错误,与python如何处理名称空间有关,与您的numpy fu无关。首先修复:将
fs
的赋值更改为

fs = [lambda x, n=n: n for n in y] fs=[lambda x,n=n:n表示y中的n] 注意参数列表中的
n=n
。这是将
lambda
中的名称
n
绑定到固定值的常见方法。默认参数在定义函数时绑定。如果不绑定参数名,则
lambda
使用正常的LEGB查找顺序。由于
n
不是在本地或封闭范围内定义的,因此它在调用函数时使用全局值。此时,
n
是循环的最后一个值:
y[-1]