你可以使用
numpy.piecewise
numpy.piecewise 允许根据某些条件定义函数。这里有三个条件[x<0, x>=1, (x>=0) & (x<1)],你可以为每个条件定义一个函数。
import matplotlib.pyplot as plt
import numpy as np
l1 = lambda x: 0.3 + x * 0
l2 = lambda x: 0.2 + x * 0
l3 = lambda x: 0.5 + x * 0
mapDiscProb=lambda x: np.piecewise(x, [x<0, x>=1, (x>=0) & (x<1)],[l1,l2,l3])
x = np.linspace(-1, 2)
y = mapDiscProb(x)
fig, ax = plt.subplots()
ax.plot(x, y, clip_on = False)
plt.show()
numpy.vectorize
numpy.vectorize 向量化一个函数,该函数打算用标量调用,这样就可以对数组中的每个元素进行评估。这允许if/else 语句按预期使用。
import matplotlib.pyplot as plt
import numpy as np
def mapDiscProb(x):
if x < 0:
return 0.3
elif x >= 1:
return 0.2
else:
return 0.5
x = np.linspace(-1, 2)
y = np.vectorize(mapDiscProb)(x)
fig, ax = plt.subplots()
ax.plot(x, y, clip_on = False)
plt.show()
numpy.select
(此想法归功于 PaulH)numpy.select 可以根据条件从不同的数组中选择选择值。对于分段常量函数,这是一个简单的工具,因为它不需要构建任何额外的函数(单线)。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-1, 2)
y = np.select([x<0, x<1, x>1], [0.3, 0.5, 0.2])
fig, ax = plt.subplots()
ax.plot(x, y, clip_on = False)
plt.show()
所有情况下的输出:
没有垂直线
如果您不希望出现任何垂直线,则可以根据条件绘制尽可能多的图。
import matplotlib.pyplot as plt
import numpy as np
l1 = lambda x: 0.3 + x * 0
l2 = lambda x: 0.2 + x * 0
l3 = lambda x: 0.5 + x * 0
x = np.linspace(-1, 2)
func = [l1,l2,l3]
cond = [x<0, x>=1, (x>=0) & (x<1)]
fig, ax = plt.subplots()
for f,c in zip(func,cond):
xi = x[c]
ax.plot(xi, f(xi), color="C0")
plt.show()
或者,使用numpy.select,您可以修改x 数组以确保包含值[0,1],它们位于条件之间的边缘。选择明确排除这些值的条件,[x<0, (x>0) & (x<1), x>1](注意缺少任何等号)将允许将这些值设置为 nan。 Nan值未显示,因此出现间隙。
import matplotlib.pyplot as plt
import numpy as np
x = np.sort(np.append(np.linspace(-1, 2),[0,1]))
y = np.select([x<0, (x>0) & (x<1), x>1], [0.3, 0.5, 0.2], np.nan)
fig, ax = plt.subplots()
ax.plot(x, y)
plt.show()