2017-03-02 114 views
0

所以我有以下代碼:如何接受「除以零」爲零? (Python)的

import numpy as np 

array1 = np.array([[[[2, 2, 3], [0, 2, 0], [2, 0, 0]], 
[[1, 2, 2], [2, 2, 0], [0, 2, 3]], 
[[0, 4, 2], [2, 2, 2], [2, 2, 3]]], 
[[[2, 3, 0], [3, 2, 0], [2, 0, 3]], 
[[0, 2, 2], [2, 2, 0], [2, 2, 3]], 
[[1, 0, 2], [2, 2, 2], [2, 2, 0]]], 
[[[2, 0, 0], [0, 2, 0], [2, 0, 0]], 
[[2, 2, 2], [0, 2, 0], [2, 2, 0]], 
[[0, 2, 2], [2, 2, 2], [2, 2, 0]]]]) 

array2 = np.array([[[[2, 2, 3], [0, 2, 0], [2, 0, 0]], 
[[1, 2, 2], [2, 2, 0], [0, 2, 3]], 
[[0, 4, 2], [2, 2, 2], [2, 2, 3]]], 
[[[2, 3, 0], [3, 2, 0], [2, 0, 3]], 
[[0, 2, 2], [2, 10, 0], [2, 2, 3]], 
[[1, 0, 2], [2, 2, 2], [2, 2, 0]]], 
[[[2, 0, 0], [0, 2, 0], [2, 0, 0]], 
[[2, 2, 2], [0, 2, 0], [2, 2, 0]], 
[[0, 2, 2], [2, 2, 2], [2, 2, 0]]]]) 

def calc(x, y): 
    result = y/x 
    return result 

final_result = [] 
for x, y in zip(array1, array2): 
    final_result.append(calc(np.array(x), np.array(y))) 

因此總的來說我有兩個列表,其中包括一些三維陣列,然後我已經定義了一個函數。最後一部分是我在功能中使用每個3D陣列的地方,最後我最終得到一些其他3D陣列的列表(final_result),其中函數已用於來自array1array2的每個條目。

但是,正如你所看到的,array1最終給出函數中的x值在一些條目中有0個值。數學上,這是不好的。但在這種情況下,我真的只需要那些沒有x的條目爲零。因此,無論何時發生這種情況,都不需要運行函數,只需跳過它即可,並將該條目保留爲零。

可以這樣做嗎?

+1

怎麼樣使用:try和except case來避免這樣的錯誤? – Shashank

+1

「我有兩個包含一些3D陣列的列表」 - 這不是您發佈的代碼。該代碼使用2個4維數組。數組列表通常是一個糟糕的主意;你應該只使用它們,如果你有一個非常強大的具體理由這樣做。 – user2357112

+0

也許我沒有使用正確的條款然後:)我實際上有(不在這裏)是一個圖像轉換成3D矩陣。所以你可能看到的4D實際上只是圖像的切片(CT掃描)。 –

回答

3

此問題已回答here。 Numpy有一個特定的方法來捕捉這樣的錯誤:

def calc(a, b): 
    """ ignore/0, div0([-1, 0, 1], 0) -> [0, 0, 0] """ 
    with np.errstate(divide='ignore', invalid='ignore'): 
     c = np.true_divide(a, b) 
     c[ ~ np.isfinite(c)] = 0 # -inf inf NaN 
    return c 
+0

打敗我吧!我還想指出,你可以設置全局numpy如何處理這些錯誤,這個文檔頁面是非常有用的:https://docs.scipy.org/doc/numpy/reference/generated/numpy.seterr.html – exp1orer

+0

@ exp1orer,你能舉一個例子,說明爲什麼依賴於默認的numpy設置是不好的嗎? – Marat

+0

@Marat我沒有提出有關默認設置是好還是壞的聲明,這取決於使用情況。總的來說,我認爲nico建議使用上下文管理器來明確您希望發生這些錯誤的位置,這可能是最好的。 – exp1orer