2016-03-15 29 views
30

Tôi có một mảng nổi (một số số bình thường, một số nans) sắp ra khỏi một áp dụng trên một khung dữ liệu gấu trúc. Đối với một số lý do, numpy.isnan không hoạt động trên mảng này, tuy nhiên như hình dưới đây, mỗi phần tử là một phao, numpy.isnan chạy đúng trên mỗi phần tử, kiểu biến chắc chắn là một mảng có nhiều mảng.Numpy isnan() thất bại trên một mảng float (từ khung dữ liệu gấu trúc áp dụng)

Điều gì đang xảy ra ?!

set([type(x) for x in tester]) 
Out[59]: {float} 

tester 
Out[60]: 
array([-0.7000000000000001, nan, nan, nan, nan, nan, nan, nan, nan, nan, 
    nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 
    nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 
    nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 
    nan, nan], dtype=object) 

set([type(x) for x in tester]) 
Out[61]: {float} 

np.isnan(tester) 
Traceback (most recent call last): 

File "<ipython-input-62-e3638605b43c>", line 1, in <module> 
np.isnan(tester) 

TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe'' 

set([np.isnan(x) for x in tester]) 
Out[65]: {False, True} 

type(tester) 
Out[66]: numpy.ndarray 

Trả lời

40

np.isnan có thể được áp dụng cho NumPy mảng của dtype gốc (chẳng hạn như np.float64):

In [99]: np.isnan(np.array([np.nan, 0], dtype=np.float64)) 
Out[99]: array([ True, False], dtype=bool) 

nhưng tăng TypeError khi áp dụng cho đối tượng mảng:

In [96]: np.isnan(np.array([np.nan, 0], dtype=object)) 
TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe'' 

Vì bạn có Pandas, bạn có thể sử dụng pd.isnull để thay thế - nó có thể chấp nhận các mảng NumPy của đối tượng hoặc native dtypes:

In [97]: pd.isnull(np.array([np.nan, 0], dtype=float)) 
Out[97]: array([ True, False], dtype=bool) 

In [98]: pd.isnull(np.array([np.nan, 0], dtype=object)) 
Out[98]: array([ True, False], dtype=bool) 

Lưu ý rằng None cũng được coi là giá trị null trong mảng đối tượng.

+0

Cảm ơn - đã sử dụng pd.isnull(). Dường như không có bất kỳ tác động hiệu suất nào. – tim654321

3

Ngày đầu câu trả lời @unubtu, bạn có thể ép buộc gấu trúc NumPy đối tượng mảng để mẹ đẻ (float64) gõ, một cái gì đó dọc theo dòng

import pandas as pd 
pd.to_numeric(df['tester'], errors='coerce') 

Xác định lỗi = 'ép buộc' để buộc dây mà không thể phân tích cú pháp thành một giá trị số để trở thành NaN. loại cột sẽ dtype: float64, và sau đó kiểm tra isnan nên làm việc

1

Một sự thay thế tuyệt vời cho np.isnan() và pd.isnull() là

for i in range(0,a.shape[0]): 
    if(a[i]!=a[i]): 
     //do something here 
     //a[i] is nan 

vì chỉ nan không bằng chính nó.

+0

có thể không hoạt động đối với mảng vì nó làm nổi tiếng "ValueError: giá trị Truth của xxx là mơ hồ". – MSeifert

+0

@MSeifert Bạn đang nói về ** python **? Tôi chỉ sử dụng phương pháp này để làm điều gì đó trong học máy, Tại sao tôi không gặp lỗi nổi tiếng? – Statham

+0

Có, có vẻ như bạn chưa từng sử dụng gấu trúc hoặc gấu trúc trước đây. Chỉ cần sử dụng 'import numpy as np; a = np.array ([1,2,3, np.nan]) 'và chạy mã của bạn. – MSeifert

Các vấn đề liên quan