Numpy isnan () không thành công trên một mảng float (áp dụng từ khung dữ liệu gấu trúc)


101

Tôi có một mảng float (một số số bình thường, một số số nans) sắp ra khỏi ứng dụng trên khung dữ liệu gấu trúc.

Vì một lý do nào đó mà numpy.isnan bị lỗi trên mảng này, tuy nhiên như hình dưới đây, mỗi phần tử là một float, numpy.isnan chạy đúng trên từng phần tử, kiểu của biến chắc chắn là một mảng numpy.

Chuyện gì vậy ?!

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

Câu trả lời:


163

np.isnan có thể được áp dụng cho các mảng NumPy của kiểu 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 mảng đối tượ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ó gấu trúc, bạn có thể sử dụng pd.isnullthay thế - nó có thể chấp nhận mảng NumPy của các kiểu đối tượng hoặc kiểu gốc:

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 đó Nonecũng được coi là giá trị null trong mảng đối tượng.


3
Cảm ơn - đã sử dụng pd.isnull (). Dường như cũng không ảnh hưởng đến hiệu suất.
tim654321

11

Một 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ó.


điều đó có thể không hoạt động đối với mảng vì nó làm tăng "ValueError: Giá trị chân lý của xxx là không rõ ràng".
MSeifert

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

Có, có vẻ như bạn chưa từng sử dụng numpy 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 19/12/16

@MSeifert er, tôi mới sử dụng numpy nhưng mã chạy ổn, không xảy ra lỗi
Statham

Trong [1]: nhập numpy dưới dạng np Trong [2]: a = np.array ([1,2,3, np.nan]) Trong [3]: in a [1. 2. 3. nan] Trong [ 4]: print a [3] == a [3] False
Statham

10

Trên @unutbu answer, bạn có thể ép mảng đối tượng numpy của gấu trúc thành kiểu gốc (float64), một cái gì đó dọc theo dòng

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

Chỉ định error = 'coerce' để buộc các chuỗi không thể phân tích cú pháp thành giá trị số trở thành NaN. Loại cột sẽ là dtype: float64, và sau đó isnankiểm tra sẽ hoạt động


Tên của anh ấy dường như là unutbu;)
Dr_Zaszuś

@ Dr_Zaszuś Cảm ơn, đã sửa
Severin Pappadeux

0

Đảm bảo rằng bạn nhập tệp csv bằng Pandas

import pandas as pd

condition = pd.isnull(data[i][j])
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.