2013-03-13 66 views
7
>>> np.__version__ 
'1.7.0' 
>>> np.sqrt(10000000000000000000) 
3162277660.1683793 
>>> np.sqrt(100000000000000000000.) 
10000000000.0 
>>> np.sqrt(100000000000000000000) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: sqrt 

Huh ... AttributeError: sqrt điều gì đang xảy ra ở đây? math.sqrt dường như không có cùng một vấn đề.Hành vi lạ của np.sqrt cho số nguyên lớn

+4

Đã học được điều gì đó mới mẻ tại đây. Cảm ơn vì đăng! – mgilson

Trả lời

8

Số cuối cùng là một (tên Python cho một số nguyên có độ chính xác tùy ý) long, mà NumPy dường như không thể đối phó với:

>>> type(100000000000000000000) 
<type 'long'> 
>>> type(np.int(100000000000000000000)) 
<type 'long'> 
>>> np.int64(100000000000000000000) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
OverflowError: Python int too large to convert to C long 

Các AttributeError xảy ra vì NumPy, nhìn thấy một kiểu mà nó không biết cách xử lý, mặc định gọi phương thức sqrt trên đối tượng; nhưng điều đó không tồn tại. Vì vậy, không phải numpy.sqrt bị thiếu, nhưng long.sqrt.

Ngược lại, math.sqrt biết về long. Nếu bạn đang đi để đối phó với số lượng rất lớn trong NumPy, sử dụng phao bất cứ khi nào khả thi.

EDIT: Alright, bạn đang sử dụng Python 3. Trong khi sự phân biệt giữa intlonghas disappeared trong phiên bản đó, NumPy vẫn còn nhạy cảm với sự khác biệt giữa một PyLongObject có thể được chuyển đổi thành công cho một C long sử dụng PyLong_AsLong và cái không thể.

+1

Nhưng, nhưng, nhưng, điều đó không giải thích 'AttributeError' ... Làm thế nào mà vô tình loại bỏ' sqrt' từ không gian tên 'numpy'? Đó là một lỗi ... – mgilson

+0

@mgilson: Tôi đã nhận được rằng :) –

+0

(Tôi chắc chắn đây là lý do cho lỗi btw - Nhưng nó là một lỗi rất lạ) – mgilson