2015-06-29 57 views
2

雖然我知道有各種問題尋找這個錯誤消息的解決方案,我還沒有找到一個答案,可以幫助我解決我的代碼來比較工作,我有代碼具有多個元素的數組的真值是不明確的。使用a.any()或a.all()

def f(x,d,h,L): 
    ans=0. 
    if ((0.<=x) & (x<d)): 
     ans=h*(x/d) 
    elif ((d<=x) & (x<=L)): 
     ans=((L-x)/(L-d)) 
    return ans 

x=np.linspace(0,10,1000) 
h=5*10**(-3) 
d=16*10**(-2) 
L=64.52*10**(-2) 
func=f(x,d,h,L) 

但是當我嘗試運行它,我得到指向在標題錯誤代碼if行的錯誤,我已經試過類似的問題給出建議的解決方案,如使用np.logical_andand代替&但所有三個產生相同的錯誤,請幫助我出

+0

'x'是一個數組。如果任何/所有'x'落在一個範圍內,你想'f'做一件事情,如果它們不屬於'x',那麼它們會不同?或者你是否希望它用一個範圍內的'x'值做一件事,另一件'x'值是不同的東西?換句話說'if'測試是否適用於整個'x'或單個元素? – hpaulj

+0

提出我的問題的另一種方法 - 如果您單獨將'x'的元素傳遞給它,函數是否正常工作? – hpaulj

回答

4

你專注於條款的結合,但這是條款本身。你可能想在這裏像這樣:

if numpy.all(0 <= x) and numpy.all(x < d): 
    ... 

查看文檔numpy.all

+0

一個可能的選擇是'numpy.all((0 <= x)&(x Evert

+0

@Evert謝謝,雖然我真的認爲答案中的版本可以從短路中獲益,但這不是,不是嗎? –

+0

給定'x'和其他參數,這些'all'測試返回'False',這意味着'f'只返回'0'。 – hpaulj

0

錯誤與數組包含超過值的事實有關。例如a < 0其中a = 1具有明確的真值(假)。但是,如果a是一個數組又是什麼。例如[-1, 0, 1],一些元素小於零,一些大於或等於零。那麼真值應該是什麼?爲了能夠創建一個真值,你必須指定是否要所有的值都小於零,或至少一個值小於零(任意的值)。

由於在numpy的陣列數學運算符返回數組本身我們可以稱之爲allany這些陣列,看看是否全部或至少一個值是真實

if (0 <= x).all() and (x < d).all(): 
    ... 
# alternatively 
if 0 <= x.min() and x.max() < d: 
    ... 
0

其他人回答假設你想申請一個計算或其他取決於是否所有/的x任何值符合相應的條件:如您會重寫你的if語句。我會做一個不同的假設 - 你想分別應用fx的每個元素。通過元素

應用元素,我得到:

In [226]: x=np.linspace(0,1,20) 

In [227]: [f(z,d,h,L) for z in x] 
Out[227]: 
[0.0, 
0.0016447368421052631, 
0.0032894736842105261, 
0.0049342105263157892, 
0.89586497157981526, 
0.78739098364212268, 
0.6789169957044302, 
0.57044300776673762, 
0.46196901982904509, 
0.35349503189135251, 
0.24502104395365998, 
0.13654705601596731, 
0.028073068078274897, 
0.0, 
0.0, 
0.0, 
0.0, 
0.0, 
0.0, 
0.0] 

的矢量相當於:

In [238]: I = (0<=x) & (x<d) 
In [239]: J=(d<=x) & (x<=L) 

In [240]: out=np.zeros_like(x) 
In [241]: out[I]=h*(x[I]/d) 
In [242]: out[J]=(L-x[J])/(L-d) 

In [243]: out 
Out[243]: 
array([ 0.  , 0.00164474, 0.00328947, 0.00493421, 0.89586497, 
     0.78739098, 0.678917 , 0.57044301, 0.46196902, 0.35349503, 
     0.24502104, 0.13654706, 0.02807307, 0.  , 0.  , 
     0.  , 0.  , 0.  , 0.  , 0.  ]) 

我讓你打包,作爲一個功能。


隨着給出的參數(包括完整x),np.all(I)np.all(J)都是False,這意味着f如果應用到x作爲一個整體將返回0.0


def f(x, d, h, L): 
    I = (0<=x) & (x<d) 
    J=(d<=x) & (x<=L) 
    out=np.zeros_like(x) 
    out[I]=h*(x[I]/d) 
    out[J]=(L-x[J])/(L-d) 
    return out 
+0

嗨。你的答案更像我所尋找的,但是,我怎樣才能把它變成'x'的函數呢?我試圖做一個* x和y *圖,看起來應該像一個三角形,左邊比右邊陡峭,高度* h *,從零到* L *的距離,d是沿* x的距離*到* y = h * – JuanGiraldo

+0

的地方我添加了功能版本。 – hpaulj

5

使用numpy.where。可選地,對浮點數使用指數表示法。

import numpy as np 

def f(x, d, h, L): 
    return np.where(x < d, h*(x/d), (L - x)/(L - d)) 

x = np.linspace(0,10,1000) 
h = 5e-3 
d = 16e-2 
L = 64.52e-2 

func = f(x, d, h, L) 
1

我能夠通過定義x爲數組分別評估每x,不知道這是否是做的最有效的方式的創建週期來解決我的問題,但我只用1000次迭代工作所以它工作得很好,這是我做的:

def f(a,d,h,L): 
ans2=[] 
for i in range(1000): 
    if (0.<=a[i]) & (a[i]<d): 
     ans=x[i]*(h/d) 
     ans2.append(ans) 
    elif ((d<=a[i]) & (a[i]<=L)): 
     ans=h*((L-a[i])/(L-d)) 
     ans2.append(ans) 
return ans2 
L=64.52*10**(-2) 
x=np.linspace(0,L,1000) 
h=5*10**(-3) 
d=16*10**(-2) 
plot.plot(x,f(x,d,h,L)) 

希望能解決別人的問題,以及,如果可以優化具有更快,我很想學習如何。

0
def f(x,d,h,L): 
    ans=0. 
    if ((0.<=x) & (x<d)): 
     ans=h*(x/d) 
    elif ((d<=x) & (x<=L)): 
     ans=((L-x)/(L-d)) 
    return ans 

#A ajouter 
f_vec = numpy.vectorize(f) 
#et c'est tout^^ 

x=np.linspace(0,10,1000) 
h=5*10**(-3) 
d=16*10**(-2) 
L=64.52*10**(-2) 
func=f_vec(x,d,h,L) #ici il faut tout de même ajouter _vec 
相關問題