Hướng dẫn dùng numpy infinity python

  1. Trang Chủ
  2. Python

Mọi người đều biết rằng trong Python, bạn có thể sử dụng các cách sau để biểu thị tích cực và tiêu cực vô tận:

float("inf") # Tích cực vô tận
float("-inf") # Tiêu cực

sử dụnginf(infinite)Bạn sẽ nhận được nó bởi 0not-a-number(NaN)。 Nếu một số vượt quá infinite, thì đó là mộtNaN(not a number)con số. Trong số NaN, phần exponent của nó là một biểu thức của giá trị tối đa, cụ thể là FF (độ chính xác đơn) ) Sau đó, sau đó, Sự khác biệt giữa số lượng NaN và số lượng infinite là: significand một phần của số lượng infinite số (<+ significand một phần của NaN không phải là 0 giá trị.

Hãy xem mã sau:

>>> inf = float("inf")
>>> ninf = float("-inf")
>>> nan = float("nan")
>>> inf is inf
True
>>> ninf is ninf
True
>>> nan is nan
True
>>> inf == inf
True
>>> ninf == ninf
True
>>> nan == nan
False
>>> inf is float("inf")
False
>>> ninf is float("-inf")
False
>>> nan is float("nan")
False
>>> inf == float("inf")
True
>>> ninf == float("-inf")
True
>>> nan == float("nan")
False

Nếu bạn chưa cố gắng xác định xem số điểm nổi có phải là NaN trong Python hay không, bạn chắc chắn sẽ ngạc nhiên bởi đầu ra trên. Trước hết, đối với các hoạt động tích cực và tiêu cực và NaN tự do is, kết quả là True, dường như không có vấn đề gì ở đây; Nhưng nếu bạn sử dụng == Hoạt động, kết quả là khác nhau. Nếu bạn sử dụng float để xác định lại một biến để so sánh với chúng với is và ==, kết quả vẫn còn bất ngờ. Lý do cho tình huống này hơi phức tạp, vì vậy tôi sẽ không đi qua nó ở đây. Nếu bạn quan tâm, bạn có thể kiểm tra thông tin liên quan.

Nếu bạn muốn phán đoán chính xác Inf và Nan, thì bạn nên sử dụng mô -đun mathmath.isinf math.isnan hàm số:

>>> import math
>>> math.isinf(inf)
True
>>> math.isinf(ninf)
True
>>> math.isnan(nan)
True
>>> math.isinf(float("inf"))
True
>>> math.isinf(float("-inf"))
True
>>> math.isnan(float("nan"))
True

Điều này là chính xác. Bây giờ tôi đang nói về vấn đề này, tôi sẽ tư vấn một lần nữa: Đừng cố gắng sử dụng is và == trong Python để xác định xem một đối tượng có dương và âm hay NaN. Bạn có thể ngoan ngoãn sử dụng mô -đun math, nếu không thì đó là để đốt cháy và đốt cháy cơ thể của bạn.

Tất nhiên, có những phương pháp khác để đưa ra các phán đoán. Các cách sử dụng sau đây NaN làm ví dụ, nhưng vẫn được khuyến nghị sử dụng mô -đun math để tránh nhầm lẫn.

Sử dụng đối tượng để đánh giá chính mình

>>> def isnan(num):
... return num != num
...
>>> isnan(float("nan"))
True

Sử dụng chức năng của mô -đun numpy

>>> import numpy as np
>>>
>>> np.isnan(np.nan)
True
>>> np.isnan(float("nan"))
True
>>> np.isnan(float("inf"))
False

Hàm isnan của Numpy cũng có thể đánh giá toàn bộ list:

>>> lst = [1, float("nan"), 2, 3, np.nan, float("-inf"), 4, np.nan]
>>> lst
[1, nan, 2, 3, nan, -inf, 4, nan]
>>> np.isnan(lst)
array([False, True, False, False, True, False, False, True], dtype=bool)

nơi đâynp.isnan Quay lại mảng giá trị boolean, nếu vị trí tương ứng là NaN, hãy trả về True, nếu không False.


<4

Trong quá trình viết các dự án, một số chức năng chắc chắn cần phải vượt qua các tham số, vì vậy chúng ta cần truyền các t

TL, DR: Không có sự khác biệt và chúng có thể được sử dụng thay thế cho nhau.

Ngoài việc có cùng giá trị math.inffloat('inf'):

>>> import math
>>> import numpy as np

>>> np.inf == float('inf')
True
>>> np.inf == math.inf
True

Nó cũng có cùng loại:

>>> import numpy as np
>>> type(np.inf)
float
>>> type(np.inf) is type(float('inf'))
float

Điều đó thật thú vị vì NumPy cũng có các loại dấu phẩy động của riêng nó:

>>> np.float32(np.inf)
inf
>>> type(np.float32(np.inf))
numpy.float32
>>> np.float32('inf') == np.inf  # nevertheless equal
True

Vì vậy, nó có cùng giá trị và cùng kiểu math.inffloat('inf')có nghĩa là nó có thể hoán đổi cho nhau.

Lý do sử dụng np.inf

  1. Nó ít phải gõ hơn:

    • np.inf (6 ký tự)
    • math.inf (8 ký tự; mới trong python 3.5)
    • float('inf') (12 ký tự)

    Điều đó có nghĩa là nếu bạn đã nhập NumPy, bạn có thể lưu cho mình 6 (hoặc 2) ký tự mỗi lần xuất hiện so với float('inf')(hoặc math.inf).

  2. Vì nó dễ nhớ hơn.

    Ít nhất đối với tôi, nó dễ nhớ np.infhơn nhiều so với việc tôi cần gọi floatbằng một chuỗi.

    Ngoài ra NumPy cũng định nghĩa một số bí danh bổ sung cho vô cực:

    np.Inf
    np.inf
    np.infty
    np.Infinity
    np.PINF
    

    Nó cũng định nghĩa một bí danh cho âm vô cực:

    np.NINF
    

    Tương tự cho nan:

    np.nan
    np.NaN
    np.NAN
    
  3. Hằng số là hằng số

    Điểm này dựa trên CPython và có thể hoàn toàn khác trong một triển khai Python khác.

    Một phiên bản floatCPython yêu cầu 24 Byte:

    >>> import sys
    >>> sys.getsizeof(np.inf)
    24
    

    Nếu bạn có thể sử dụng lại cùng một phiên bản, bạn có thể tiết kiệm rất nhiều bộ nhớ so với việc tạo nhiều phiên bản mới. Tất nhiên, điểm này sẽ bị tắt tiếng nếu bạn tạo infhằng số của riêng mình nhưng nếu bạn không tạo thì:

    a = [np.inf for _ in range(1000000)]
    b = [float('inf') for _ in range(1000000)]
    

    bsẽ sử dụng nhiều hơn 24 * 1000000 Byte (~ 23 MB) bộ nhớ a.

  4. Truy cập một hằng số nhanh hơn việc tạo biến.

    %timeit np.inf
    37.9 ns ± 0.692 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
    %timeit float('inf')
    232 ns ± 13.9 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
    
    %timeit [np.inf for _ in range(10000)]
    552 µs ± 15.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    %timeit [float('inf') for _ in range(10000)]
    2.59 ms ± 78.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    

    Tất nhiên, bạn có thể tạo hằng số của riêng mình để chống lại điểm đó. Nhưng tại sao phải bận tâm nếu NumPy đã làm điều đó cho bạn.

31 hữu ích 5 bình luận chia sẻ