Python 使用Numpy和Pyplot进行条件打印

Python 使用Numpy和Pyplot进行条件打印,python,numpy,plot,comparison,conditional,Python,Numpy,Plot,Comparison,Conditional,我试图绘制一个有条件定义的函数。明确地: U(x)=(2**delta)/((D-D)**delta)*(D/2-(x-x0))**delta,对于小于D/2的abs(x-x0),否则为0 但我的问题是,我希望将x,x0作为numpy数组,因为这就是我在实际代码的其余部分中使用它们的方式 我设置了以下示例: import numpy as np import matplotlib.pyplot as plt AD = 0.2 D = 0.4 delta = 8 def Parabolic(x,

我试图绘制一个有条件定义的函数。明确地: U(x)=(2**delta)/((D-D)**delta)*(D/2-(x-x0))**delta,对于小于D/2的abs(x-x0),否则为0

但我的问题是,我希望将x,x0作为numpy数组,因为这就是我在实际代码的其余部分中使用它们的方式

我设置了以下示例:

import numpy as np
import matplotlib.pyplot as plt
AD = 0.2
D = 0.4
delta = 8

def Parabolic(x, delta, D, AD):
    x0 = np.round(x)
    tempx = np.abs(x-x0)
    tempD = D/2*np.ones(len(x))
    if tempx<tempD:
        return ((2**delta)/(D-AD)**delta)*(D/2 - (x-x0))**delta
    else:
        return 0

figure = plt.figure(figsize=(10,8), dpi=72)  
xmin = -1.0
xmax = 1.0
X = np.linspace(xmin,xmax,1000)
plt.plot(X, Parabolic(X, delta=8, D=0.4, AD=0.2))
将numpy导入为np
将matplotlib.pyplot作为plt导入
AD=0.2
D=0.4
δ=8
def抛物线(x,增量,D,AD):
x0=np.圆形(x)
tempx=np.abs(x-x0)
tempD=D/2*np.one(len(x))

如果tempx尝试使用numpy逻辑阵列:

import numpy as np
import matplotlib.pyplot as plt
AD = 0.2
D = 0.4
delta = 8

def Parabolic(x, delta, D, AD):
    rtn_arr = np.zeros(len(x))
    x0 = np.round(x)
    tempx = np.abs(x-x0)
    tempD = D/2*np.ones(len(x))
    lgc_arr = tempx<tempD
    x_cut = x[lgc_arr]
    x0_cut = x0[lgc_arr]
    rtn_arr[lgc_arr] = ((2**delta)/(D-AD)**delta)*(D/2 - (x_cut-x0_cut))**delta
    return rtn_arr

figure = plt.figure(figsize=(10,8), dpi=72)
xmin = -1.0
xmax = 1.0
X = np.linspace(xmin,xmax,1000)
plt.plot(X, Parabolic(X, delta=8, D=0.4, AD=0.2))
将numpy导入为np
将matplotlib.pyplot作为plt导入
AD=0.2
D=0.4
δ=8
def抛物线(x,增量,D,AD):
rtn_arr=np.零(len(x))
x0=np.圆形(x)
tempx=np.abs(x-x0)
tempD=D/2*np.one(len(x))

lgc_arr=tempx必须是一个ufunc,所以不能在代码中使用python测试

一个简单的解决方法是:

def Parabolic(x, delta, D, AD):
    x0 = np.round(x)
    tempx = np.abs(x-x0)
    tempD = D/2*np.ones(len(x))
    u=(((2**delta)/(D-AD)**delta)*(D/2 - (x-x0))**delta)
    u[tempx>=tempD]=0
    return u  
或者为了避免不必要的计算:

def Parabolic2(x, delta, D, AD):
    x0 = np.round(x)
    tempx = np.abs(x-x0)
    tempD = D/2*np.ones(len(x))
    u= zeros_like(x)
    valid=tempx<tempD
    u[valid]=(((2**delta)/(D-AD)**delta)*(D/2 - (x-x0)[valid])**delta)
    return u

嗯,这正是我想要的。我设法用python列表和append解决了我的问题,但当然没有那么好。你的才是我想要的。我不知道人们可以使用
x_cut=x[lgc_array]
只获得与true对应的元素!最后一件事:你能给我解释一下行
lgc_arr=tempx
tempx@GeorgeDatseris正如你所说。numpy数组重新定义了条件运算符(可以对任何自定义类进行定义),因此使用
>,这也是一个很好的解决方法,并且非常简单。然而,这确实意味着我必须计算所有值的函数,无论大小。在普通代码中,这将花费大量时间。我打算对
u
函数的非常高和非常小的值使用第一个答案,主要是为了避免计算。我认为第二个版本不会工作,因为
u[tempxI试图运行代码,但确实由于您所说的原因,它没有完成。关于您的错误,请参阅及其侧栏。
In [141]: %timeit Parabolic(x,8,.4,.2)
1000 loops, best of 3: 310 µs per loop

In [142]: %timeit Parabolic2(x,8,.4,.2)
1000 loops, best of 3: 218 µs per loop