Có thể đặt một số thành NaN hoặc vô cùng?


202

Có thể đặt phần tử của một mảng NaNtrong Python không?

Ngoài ra, có thể đặt biến thành +/- vô cùng không? Nếu vậy, có chức năng nào để kiểm tra xem một số có vô cùng hay không?


3
stackoverflow.com/questions/944700 cho bạn biết cách kiểm tra NaN. Đối với Inf và -Inf, bạn có thể kiểm tra với == nhưng điều đó không hiệu quả với NaN vì các quy tắc của IEEE754 cho NaN.
David Heffernan

Tôi nghĩ rằng cách đáng tin cậy nhất là sử dụng các chức năng phù hợp như isinfisnanđược cung cấp bởi numpy. Xem câu trả lời của tôi dưới đây.
Olivier Verdier

Câu trả lời:


271

Truyền từ chuỗi bằng float():

>>> float('NaN')
nan
>>> float('Inf')
inf
>>> -float('Inf')
-inf
>>> float('Inf') == float('Inf')
True
>>> float('Inf') == 1
False

1
Điều đó sẽ dạy tôi không nhảy vào quất trước khi đọc câu hỏi lần thứ hai !! Lấy làm tiếc! Điều đó nói rằng, sẽ không đau khi nói như vậy bởi vì đó là một cái bẫy dễ rơi vào, NaN! = NaN
David Heffernan

2
cũng lưu ý: >>> float ('Inf') - float ('Inf') ===> nan
ntg

76

Vâng, bạn có thể sử dụng numpycho điều đó.

import numpy as np
a = arange(3,dtype=float)

a[0] = np.nan
a[1] = np.inf
a[2] = -np.inf

a # is now [nan,inf,-inf]

np.isnan(a[0]) # True
np.isinf(a[1]) # True
np.isinf(a[2]) # True

21
Trên python> = 2.6, bạn chỉ có thể sử dụng math.isnan()math.isinf()
Agos

8
numpylà một nhập khẩu khá nặng nếu tất cả những gì bạn muốn là NaNhoặcinf
cz

1
Nếu tất cả những gì bạn cần là NaNhoặc Inf, người ta có thể from numpy import nan, inftồn tại kể từ khi câu hỏi này được nêu ra.
andrewgu

37

Có thể đặt một số thành NaN hoặc vô cùng?

Vâng, trên thực tế có một số cách. Một số công việc không có bất kỳ nhập khẩu nào, trong khi những người khác yêu cầu import, tuy nhiên đối với câu trả lời này, tôi sẽ giới hạn các thư viện trong tổng quan về thư viện tiêu chuẩn và NumPy (không phải là thư viện tiêu chuẩn mà là thư viện của bên thứ ba rất phổ biến).

Bảng sau đây tóm tắt các cách người ta có thể tạo một số không hoặc một số vô cực dương hoặc âm float:

╒══════════╤══════════════╤════════════════════╤════════════════════╕
   result  NaN           Infinity            -Infinity          
 module                                                         
╞══════════╪══════════════╪════════════════════╪════════════════════╡
 built-in  float("nan")  float("inf")        -float("inf")      
                         float("infinity")   -float("infinity") 
                         float("+inf")       float("-inf")      
                         float("+infinity")  float("-infinity") 
├──────────┼──────────────┼────────────────────┼────────────────────┤
 math      math.nan      math.inf            -math.inf          
├──────────┼──────────────┼────────────────────┼────────────────────┤
 cmath     cmath.nan     cmath.inf           -cmath.inf         
├──────────┼──────────────┼────────────────────┼────────────────────┤
 numpy     numpy.nan     numpy.PINF          numpy.NINF         
           numpy.NaN     numpy.inf           -numpy.inf         
           numpy.NAN     numpy.infty         -numpy.infty       
                         numpy.Inf           -numpy.Inf         
                         numpy.Infinity      -numpy.Infinity    
╘══════════╧══════════════╧════════════════════╧════════════════════╛

Một vài nhận xét cho bàn:

  • Hàm floattạo thực sự không phân biệt chữ hoa chữ thường, vì vậy bạn cũng có thể sử dụng float("NaN")hoặc float("InFiNiTy").
  • Các hằng số cmathnumpytrả về floatcác đối tượng Python đơn giản .
  • Đây numpy.NINFthực sự là hằng số duy nhất tôi biết không yêu cầu -.
  • Có thể tạo NaN và Infinity phức tạp với complexcmath:

    ╒══════════╤════════════════╤═════════════════╤═════════════════════╤══════════════════════╕
       result  NaN+0j          0+NaNj           Inf+0j               0+Infj               
     module                                                                               
    ╞══════════╪════════════════╪═════════════════╪═════════════════════╪══════════════════════╡
     built-in  complex("nan")  complex("nanj")  complex("inf")       complex("infj")      
                                                complex("infinity")  complex("infinityj") 
    ├──────────┼────────────────┼─────────────────┼─────────────────────┼──────────────────────┤
     cmath     cmath.nan ¹     cmath.nanj       cmath.inf ¹          cmath.infj           
    ╘══════════╧════════════════╧═════════════════╧═════════════════════╧══════════════════════╛
    

    Các tùy chọn với ¹ trả về một đơn vị float, không phải là a complex.

Có chức năng nào để kiểm tra xem một số có vô cùng hay không?

Đúng là có - trên thực tế có một số chức năng cho NaN, Infinity và cả Nan và Inf. Tuy nhiên, các hàm được xác định trước này không được tích hợp sẵn, chúng luôn yêu cầu import:

╒══════════╤═════════════╤════════════════╤════════════════════╕
      for  NaN          Infinity or     not NaN and        
                        -Infinity       not Infinity and   
 module                                 not -Infinity      
╞══════════╪═════════════╪════════════════╪════════════════════╡
 math      math.isnan   math.isinf      math.isfinite      
├──────────┼─────────────┼────────────────┼────────────────────┤
 cmath     cmath.isnan  cmath.isinf     cmath.isfinite     
├──────────┼─────────────┼────────────────┼────────────────────┤
 numpy     numpy.isnan  numpy.isinf     numpy.isfinite     
╘══════════╧═════════════╧════════════════╧════════════════════╛

Lại một vài nhận xét:

  • Các hàm cmathnumpyhàm cũng hoạt động đối với các đối tượng phức tạp, chúng sẽ kiểm tra xem phần thực hay phần ảo là NaN hay Infinity.
  • Các numpyhàm cũng hoạt động cho numpycác mảng và mọi thứ có thể được chuyển đổi thành một (như danh sách, bộ dữ liệu, v.v.)
  • Ngoài ra còn có các hàm kiểm tra rõ ràng về vô cực dương và âm trong NumPy: numpy.isposinfnumpy.isneginf.
  • Pandas cung cấp hai chức năng bổ sung để kiểm tra NaN: pandas.isnapandas.isnull(nhưng không chỉ NaN, nó cũng phù hợp NoneNaT)
  • Mặc dù không có các hàm dựng sẵn, nhưng sẽ dễ dàng tự tạo chúng (tôi bỏ qua việc kiểm tra và tài liệu loại ở đây):

    def isnan(value):
        return value != value  # NaN is not equal to anything, not even itself
    
    infinity = float("infinity")
    
    def isinf(value):
        return abs(value) == infinity 
    
    def isfinite(value):
        return not (isnan(value) or isinf(value))
    

Để tóm tắt các kết quả dự kiến ​​cho các chức năng này (giả sử đầu vào là dấu phẩy):

╒════════════════╤═══════╤════════════╤═════════════╤══════════════════╕
          input  NaN    Infinity    -Infinity    something else   
 function                                                         
╞════════════════╪═══════╪════════════╪═════════════╪══════════════════╡
 isnan           True   False       False        False            
├────────────────┼───────┼────────────┼─────────────┼──────────────────┤
 isinf           False  True        True         False            
├────────────────┼───────┼────────────┼─────────────┼──────────────────┤
 isfinite        False  False       False        True             
╘════════════════╧═══════╧════════════╧═════════════╧══════════════════╛

Có thể đặt phần tử của một mảng thành NaN trong Python không?

Trong danh sách không có vấn đề gì, bạn luôn có thể bao gồm NaN (hoặc Infinity) ở đó:

>>> [math.nan, math.inf, -math.inf, 1]  # python list
[nan, inf, -inf, 1]

Tuy nhiên, nếu bạn muốn đưa nó vào một array(ví dụ array.arrayhoặc numpy.array) thì kiểu của mảng phảifloathoặc complexbởi vì nếu không nó sẽ cố gắng hạ thấp nó thành kiểu mảng!

>>> import numpy as np
>>> float_numpy_array = np.array([0., 0., 0.], dtype=float)
>>> float_numpy_array[0] = float("nan")
>>> float_numpy_array
array([nan,  0.,  0.])

>>> import array
>>> float_array = array.array('d', [0, 0, 0])
>>> float_array[0] = float("nan")
>>> float_array
array('d', [nan, 0.0, 0.0])

>>> integer_numpy_array = np.array([0, 0, 0], dtype=int)
>>> integer_numpy_array[0] = float("nan")
ValueError: cannot convert float NaN to integer

1
Lưu ý: math.isnankhông hoạt động với số phức. Sử dụng math.isnan(x.real) or math.isnan(x.imag)thay thế.
Jonathan H

2

Khi sử dụng Python 2.4, hãy thử

inf = float("9e999")
nan = inf - inf

Tôi đang đối mặt với vấn đề khi tôi chuyển đơn giản sang một thiết bị nhúng chạy Python 2.4, đã float("9e999")sửa nó. Không sử dụng inf = 9e999, bạn cần chuyển đổi nó từ chuỗi. -infđưa ra -Infinity.

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.