2011-10-27 44 views
0

用來做磁盤陣列功能,我有這樣的功能:「如果」在Python

def q(x,y): 
    r2 = (x/2.)**2 + (2.0*y)**2 
    if (r2 > 0.04): 
     return 0. 
    else: 
     return 1.5 

,我想叫它使用類似

from pylab import * 
dl=0.025 
X, Y = mgrid[-0.5:0.5:dl, -0.5:0.5:dl] 
g(X,Y) 

但很明顯,這給在比較錯誤。

這可以做,而不必爲X和Y做一個循環? 因爲如果我想呼籲兩個雙打Q(X,Y),該用於循環必須重新實現該案例...

編輯:(添加到這個問題,因爲它太長了但可能有助於他人回答。)

看起來pylab.mgridnumpy.mgrid相同。

調整爲numpy,該代碼

import numpy 
def q(x,y): 
    r2 = (x/2.)**2 + (2.0*y)**2 
    if (r2 > 0.04): 
     return 0. 
    else: 
     return 1.5 

dl=0.025 
X, Y = numpy.mgrid[-0.5:0.5:dl, -0.5:0.5:dl] 
q(X,Y) 

給出了這樣的錯誤

if (r2 > 0.04): 
ValueError: The truth value of an array with more than one element is 
ambiguous. Use a.any() or a.all() 
+0

我不知道pylab所以..究竟是什麼在'r2'和你想用它做什麼?如果它是一個數組 - 你想比較什麼?所有元素都必須滿足條件或..? – rplnt

+0

r2是一個省略號的r^2 ... g(X,Y)應該是一個類似mgrid的值,但是在X,Y的每個點上都有值。 –

+0

請告訴我們一個小例子''mgrid'是什麼對象:'print repr(mgrid)'。 – hochl

回答

3

表達式r2 > 0.04的計算結果爲布爾值的NumPy數組,因此您不能在if語句中使用它。你可以讓它自動重新解釋爲數字,但:

def q(x,y): 
    r2 = (x/2.)**2 + (2.0*y)**2 
    return 1.5 * (r2 <= 0.04) 
+0

這不是最通用的解決方案,但它解決了這個特定問題的問題。你知道一種避免這種情況的方法來處理更多的情況(如果還有其他情況,等等) –

+0

@J.C.Leitão:如何矢量化一段代碼的具體細節取決於代碼的細節。在這個特定的例子中,它比較簡單,在其他情況下更難,有時不可能。通常可以使用'&'和'|'運算符或部分賦值'r2 [r2> 0.04] = ...'將給定的技術擴展到多個'if'語句。 –

+0

好的。感謝Sven分享的想法和知識。 –

0

您可以使用map給你的函數應用到每對夫婦的元素。

+1

在給定的上下文中,這個答案是錯誤的。 'X'和'Y'是二維數組,所以'zip()'會產生成對的行,所以問題仍然沒有解決。而且,NumPy的重點在於避免所有元素上的這種Python循環。 –

+0

好吧,我刪除了非工作代碼。但我的回答精神只是提出「地圖」作爲解決問題的可能方式;它並不意味着是最有效的解決方案。 – Don

+1

刪除我的downvote,因爲答案不再錯。不過,我認爲這仍然不是特別有用。 –