簡體   English   中英

Python 類型檢查 numpy arrays 包括它們的數據類型

[英]Python type checking numpy arrays include their dtype

我可以使用以下方法驗證我的 function 接收到正確類型的輸入:

def foo(x: np.ndarray, y: float):
    return x * y

確保如果我嘗試將此 function 與不是np.ndarrayx一起使用,即使在運行代碼之前我也會收到錯誤消息。

我不知道的是如何驗證數組類型。 例如:

 def return_valid_points_only(points: np.ndarray, valid: np.ndarray):
    assert points.shape == valid.shape
    return points[valid]

我想檢查valid不僅是np.ndarray還是valid.dtype == bool

對於此示例,如果valid將提供 0 和 1 以指示有效性,程序將不會失敗並且我會得到糟糕的結果。

謝謝

Python 是關於請求寬恕,而不是許可。 這意味着即使在您的第一個定義中, def foo(x: np.ndarray, y: float):也確實依賴於用戶遵守提示,除非您使用類似 mypy 的東西。

您可以在這里采用幾種方法,通常是串聯使用。 一種是以處理傳入輸入的方式編寫 function,這可能意味着失敗或強制輸入無效。 另一種方法是仔細記錄您的代碼,以便用戶做出明智的決定。 第二種方法尤為重要,但我將重點介紹第一種。

Numpy 會為您完成大部分檢查。 例如,與其期待一個數組,不如強制一個:

x = np.asanyarray(x)

np.asanyarray通常是array(a, dtype, copy=False, order=order, subok=True)的別名。 您可以為y做類似的事情:

y = np.asanyarray(y).item()

這將允許任何類數組,只要它有一個元素,無論是否為標量。 另一種方法是尊重 numpy 一起廣播 arrays 的能力,因此如果用戶將y作為x.shape[-1]元素的列表傳遞。

對於您的第二個 function,您有幾個選擇。 一種選擇是允許花哨的索引。 因此,如果用戶傳入索引列表與 boolean 掩碼,則可以同時使用兩者。 另一方面,如果您堅持使用 boolean 掩碼,則可以檢查或強制 dtype。

如果您檢查,請記住,如果數組大小不匹配,numpy 索引操作將為您引發錯誤。 您只需要檢查類型本身:

points = np.asanyarray(points)
valid = np.asanyarray(valid)
if valid.dtype != bool:
    raise ValueError('valid argument must be a boolean mask')

如果您選擇強制,用戶將被允許使用零和一,但不會不必要地復制有效輸入:

valid = np.asanyarray(valid, bool)

我可以使用以下方法驗證我的 function 接收到正確類型的輸入:

def foo(x: np.ndarray, y: float):
    return x * y

確保如果我嘗試將此 function 與不是np.ndarrayx一起使用,即使在運行代碼之前我也會收到錯誤消息。

我不知道的是如何驗證數組類型。 例如:

 def return_valid_points_only(points: np.ndarray, valid: np.ndarray):
    assert points.shape == valid.shape
    return points[valid]

我想檢查valid不僅是np.ndarray也是valid.dtype == bool

對於這個例子,如果valid將提供 0 和 1 來表示有效性,程序不會失敗,我會得到可怕的結果。

謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM