- Trang Chủ
- 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ố [>> 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
và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.
>> 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.inf
và float['inf']
có nghĩa là nó có thể hoán đổi cho nhau.
Lý do sử dụng np.inf
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ặcmath.inf
].Vì nó dễ nhớ hơn.
Ít nhất đối với tôi, nó dễ nhớ
np.inf
hơn nhiều so với việc tôi cần gọifloat
bằ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
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
float
CPython 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
inf
hằ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]]
b
sẽ sử dụng nhiều hơn 24 * 1000000 Byte [~ 23 MB] bộ nhớa
.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ẻ