Numpy和Pyplot的条件绘图

时间:2016-04-01 15:12:45

标签: python numpy plot comparison conditional

我正在尝试绘制一个有条件定义的函数。特别: U(x)=(2 ** delta)/((Dd)** delta)*(D / 2 - (x-x0))** delta,abs(x-x0)小于D / 2和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))

显然这个例子不起作用,因为行tempx<tempD引发了列表的真值 - 含糊不清的错误。

我搜索了numpy的文档并找到了函数np.less(tempx,tempD)。但是,如果我将tempx < tempD替换为np.less(tempx, tempD),它仍然无法工作,因为我再一次要求整个列表的真值。我知道问题不在于numpy,而在于我无法理解如何使用numpy提供的逻辑函数。

我很抱歉,如果这在另一篇文章中以某种方式回答,我在这个论坛中搜索但除了curve()方法之外找不到其他东西。但是我想保留我的numpy.array格式以用于我的实际代码。我敢打赌,答案必须非常简单,我无法想到它。

2 个答案:

答案 0 :(得分:4)

尝试使用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))

答案 1 :(得分:3)

抛物线必须是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

第二个更快:

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