Tôi cần viết một hàm sẽ phát hiện xem đầu vào có chứa ít nhất một giá trị không phải là số hay không. Nếu một giá trị không phải số được tìm thấy, tôi sẽ báo lỗi (vì phép tính chỉ trả về giá trị số). Số lượng kích thước của mảng đầu vào không được biết trước - hàm phải cung cấp giá trị chính xác bất kể ndim. Như một sự phức tạp bổ sung, đầu vào có thể là một float đơn lẻ numpy.float64
hoặc thậm chí là một thứ gì đó kỳ quặc như mảng không chiều.
Cách rõ ràng để giải quyết vấn đề này là viết một hàm đệ quy lặp lại trên mọi đối tượng có thể lặp lại trong mảng cho đến khi nó tìm thấy một không lặp. Nó sẽ áp dụng numpy.isnan()
chức năng trên mọi đối tượng không thể lặp lại. Nếu ít nhất một giá trị không phải là số được tìm thấy thì hàm sẽ trả về False ngay lập tức. Ngược lại, nếu tất cả các giá trị trong biến có thể lặp lại là số thì cuối cùng nó sẽ trả về True.
Điều đó hoạt động tốt, nhưng nó khá chậm và tôi hy vọng rằng NumPy có cách tốt hơn nhiều để làm điều đó. Đâu là giải pháp thay thế nhanh hơn và nhiều hơn?
Đây là mô hình của tôi:
def contains_nan( myarray ):
"""
@param myarray : An n-dimensional array or a single float
@type myarray : numpy.ndarray, numpy.array, float
@returns: bool
Returns true if myarray is numeric or only contains numeric values.
Returns false if at least one non-numeric value exists
Not-A-Number is given by the numpy.isnan() function.
"""
return True
array(['None', 'None'], dtype=object)
? Một đầu vào như vậy có nên chỉ nêu ra một ngoại lệ không?
float('nan') in x
. Nó không hoạt động.
contains_nan
vẻ đáng ngờ: "Trả về false nếu tồn tại ít nhất một giá trị không phải số". Tôi đã mong đợi sẽcontains_nan
trả vềTrue
nếu mảng chứa NaN.