2016-04-01 13 views
2

Koşullu olarak tanımlanan bir işlevi çizmeye çalışıyorum. Spesifik olarak: U (x) = (2 ** delta)/((Dd) ** delta) * (D/2 - (x-x0)) ** delta, abs için (x-x0) D'den daha az/Aksi halde 2 ve 0.Numpy ve Pyplot ile Koşullu Plotlama

Ancak benim sorunum, x, x0 numpy dizileri olmasını istiyorum, çünkü bunları benim gerçek kodun geri kalanında kullanıyorum.

Ben-kurdunuz şu örneği: satır tempx<tempD bir listesinin bir Hakikat-değeri belirsiz olduğu hatayı yükseltir beri

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

Açıkçası bu örnek, çalışmıyor.

Numune belgelerini araştırdım ve np.less (tempx, tempD) işlevini buldum. Ancak tempx < tempD'u np.less(tempx, tempD) ile değiştirirsem yine de bir kez daha tüm listenin gerçek değerini talep ediyorum. Sorunun uyuşma ile değil, fakat numpy'nin sağladığı mantıksal işlevlerin nasıl kullanılacağını anlayamamamla ilgili olduğunu anlıyorum.

Başka bir gönderide bu şekilde yanıt verdiysem özür dilerim, bu forumu aradım ancak curve() yönteminin dışında başka bir şey bulamadım. Ancak, numpy.array formatımı gerçek kodlarımda kullanmak için tutmak istiyorum. Bahse girerim cevabın çok basit olması gerektiğini düşünüyorum, sadece düşünemiyorum.

+0

, http: // stackoverflow.com/a/30081652/901925 ve onun kenar çubuğu. – hpaulj

cevap

3

mantıksal diziler numpy kullandığı bu deneyin: kodunuzda piton testini koyamazsınız böylece

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

Eh, tam da aradığım şey bu. Sorunumu python listelerini kullanarak çözdüm ve ekledim, ama tabiki bu iyi değildi. Seninki benim aradığım şeydi. Sadece doğru olana karşılık gelen elemanları almak için 'x_cut = x [lgc_array]' ı kullanabileceğini bilmiyordum! Son bir şey: Bana "lgc_arr = tempx

+0

'tempx hpaulj

+0

@GeorgeDatseris Tam olarak söylediğin gibi. Numpy dizileri, koşullu operatörleri (https://docs.python.org/2/library/stdtypes.html) herhangi bir özel sınıf için yapılabilir. Böylece, numpy dizilerinde '>, <' vb. Kullanılarak numpy dizileri döndürülür. . Daha sonra 'tempx Xirtaminu

2

Parabolik bir ufunc olmalıdır.

basit bir geçici çözüm:

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 

veya gereksiz hesaplamaları önlemek için:

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 

ikinci edilir slighty daha hızlı: Hatanızla Açık

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

Bu da güzel bir geçici çözüm ve oldukça basit bir koddur. Bununla birlikte, küçük ve büyük olan tüm değerler için işlevi hesaplamak zorunda olduğum anlamına gelir. Ve bu normal kodda çok zaman alacaktır. Temel olarak hesaplamaları önlemek için ilk uyaranı 'u' işlevinin çok yüksek ve çok küçük değerleri için kullanmayı düşünmekteyim. –

+0

tamam; Bu durumda başka bir yol ekliyorum. –

+0

İkinci versiyonun "u [tempx Xirtaminu