2017-02-27 35 views
-2

我有一個數據的數據文件,我用ascii.read讀入python列表。我使用np.asarray轉換它們,所以我可以使用列表的值進行計算。一些計算以分母中的負值ln或0結束,顯然,這是破裂的。我試圖做一個if else陳述,如果它不是< 0然後乘以-1。如果沒有,通常進行數學運算。 (我不知道我是否只想乘以-1或做其他事情)。Python - ValueError:具有多個元素的數組的真值是不明確的。使用a.any()或a.all()

我收到此錯誤: ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我希望有一個列表/數組作爲我的輸出,所以a.any或a.all不幫我,我很擔心個人的價值觀,而不是是否列表包含它或不包含。

for item in radius: 
subtraction = np.array(npi0/(npp - npb)) 
if subtraction < 0: 
    tau = np.array(B*(np.log(subtraction*(-1)))) 
else: 
    tau = np.array(B*(np.log(subtraction))) 

我很抱歉,如果這個特定的問題重複,我找不到有關我的問題具體的東西。我剛剛在過去幾周開始編程。

+0

請修復您的縮進,哪一行會引發錯誤? –

+0

'subtraction <0'詢問這個數組是否小於零,這是一個長度問題。你可以遍歷'subtraction'的元素。 – vincentmajor

回答

1

要替換所有值零下與它的絕對只使用一個布爾面具,並用-1乘以(或做任何你想做的事情有):

subtraction[subtraction < 0] *= -1 
tau = np.array(B*(np.log(subtraction))) 

你也可以使用np.where和像np.abs功能:

subtraction = np.where(subtraction < 0, np.abs(subtraction), subtraction) 

其中創建包含絕對其中原始陣列是一個新的數組< 0或原始值,其中減法不滿足條件>= 0

由於@Robert克恩在評論中指出,一個不需要在這種情況下,任何分支:

tau = B * np.log(np.abs(subtraction)) 
+2

只要'tau = B * np.log(abs(減法))'就可以了。不需要用'if'或'where'做任何分支。 –

+0

@RobertKern不錯,我不能相信我錯過了那個明顯的解決方案。我更關心如何處理條件和numpy數組的更一般的方法。我會更新答案。 – MSeifert

+0

謝謝您的信息。我會給它一個鏡頭! –

0

這個值誤差經常出現 - 看到所有的側邊欄的問題。基本上它的結果試圖在if語句中使用一個布爾數組:

In [218]: sub = np.arange(-5,5)  
In [219]: sub 
Out[219]: array([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]) 
In [220]: sub<0 
Out[220]: array([ True, True, True, True, True, False, False, False, False, False], dtype=bool) 

In [221]: if sub<0: print('ouch') 
... 
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

哪些真或假的就應該使用?像這樣的if沒有任何內建或隱含的循環。

@MSeifert已經提出了很好的解決方案,但您應該瞭解問題的根源。

處理,你想要做不同的事情,一個數組的部分病例較好的一般方法是布爾掩碼:

In [222]: mask = sub<0  

In [223]: np.log(-sub[mask]) 
Out[223]: array([ 1.60943791, 1.38629436, 1.09861229, 0.69314718, 0.  ]) 

In [224]: np.log(sub[~mask]) 
/usr/local/bin/ipython3:1: RuntimeWarning: divide by zero encountered in log 
    #!/usr/bin/python3 
Out[224]: array([  -inf, 0.  , 0.69314718, 1.09861229, 1.38629436]) 

(我可以改進的掩碼處理sub==0情況下)。

+0

謝謝你的信息。 –

相關問題