2016-04-01 10 views
2

条件付きで定義された関数をプロットしようとしています。 D(x-x0)より小さいabs(x-x0)の場合、U(x)=(2 **デルタ)/((Dd)**デルタ)*(D/2-(x-x0))**デルタ。 D /そうでなければ2と0です。NumpyとPyplotによる条件付きプロット

しかし、私の問題は、numpy配列としてx、x0を使用したいということです。実際のコードの残りの部分でこれを使用する方法です。

私がセットアップしている次の例を:

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 < tempDnp.less(tempx, tempD)に置き換えても、それはもう一度私はリスト全体の真理値を求めているので、まだ動作しません。問題はnumpyではなく、numpyが提供する論理関数の使い方を理解することができないことを理解しています。

これは別の投稿で何らかの回答があった場合は申し訳ありませんが、私はこのフォーラムで検索しましたが、curve()メソッドのほかに何かを見つけることができませんでした。しかし私は実際のコードで使用するためにnumpy.array形式を保持したい。私は答えが非常にシンプルでなければならないと確信しています、私はそれを考えることができません。

+0

、HTTPを参照してください:// stackoverflow.com/a/30081652/901925とそのサイドバー。 – hpaulj

答えて

3

numpyの論理的な配列を使用する、これを試してください:あなたは、あなたのコード内でのpythonのテストを置くことができないので、

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)) 
+0

これはまさに私が探していたものです。 私はPythonのリストを使用して私の問題を解決し、追加することができましたが、それはあまり良くありませんでした。あなたのものは私が探していたものでした。 trueに対応する要素だけを取得するために、 'x_cut = x [lgc_array]'を使うことができるかどうかわかりませんでした!一つの最後のこと: 'lgc_arr = tempx

+0

'tempx hpaulj

+0

@GeorgeDatserisあなたが言うとおりに。 numpy配列は条件付き演算子を再定義します(これはカスタムクラスhttps://docs.python.org/2/library/stdtypes.htmlで行うことができます)。numpy配列で '>、<'などを使うとnumpy配列を返すようになります。それで 'tempx Xirtaminu

2

パラボリックは、ufuncでなければなりません。

簡単な回避策は次のとおりです。

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 

秒をさslighty速く:あなたのエラーの

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 
+0

これは素晴らしい回避策であり、非常に簡単なコードワイズです。しかし、それはすべての値、小さいものと大きいものの関数を計算しなければならないという意味です。そして、これは通常のコードでは多くの時間がかかるでしょう。私は、主に計算を避けるために、 'u'関数の非常に高い値と非常に小さな値の両方に対して、最初の答えを使うつもりです。 –

+0

ok;この場合、私は別の方法を追加します。 –

+0

私は 'u [tempx Xirtaminu