2013-03-13 19 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 burada neler oluyor? math.sqrt, aynı soruna sahip görünmüyor.Büyük tamsayılar için np.sqrt'ın garip davranışı

+4

burada yeni bir şey öğrendim. Gönderdiğiniz için teşekkürler! – mgilson

cevap

8

son numara NumPy görünüşte başa çıkamaz bir long (keyfi hassas tamsayı için Python'un ad) vardır:

>>> 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 

NumPy, bir tür görme değil mi çünkü AttributeError oluşur nasıl ele alınacağını bilmek, nesnede sqrt yöntemini çağırmak için varsayılanlar; ama bu mevcut değil. Yani eksik olan numpy.sqrt değil, long.sqrt. Buna karşılık

, math.sqrt yaklaşık long bilir. NumPy'de çok büyük sayılarla uğraşacaksanız, mümkün olduğunda şamandıralar kullanın.

DÜZENLEME: bu sürümde int ve longhas disappeared arasındaki ayrım, NumPy hala başarılı PyLong_AsLong kullanarak bir C long dönüştürülebilir bir PyLongObject arasındaki farka duyarlı iken Tamam, Python 3. kullandığınız ve yapamayacak biri.

+1

Ama, ama, 'AttributeError' açıklamasın ... Bu 'sqpy '' numpy' ad alanından yanlışlıkla nasıl kaldırılır? Yani lazım bir hata olmalı ... – mgilson

+0

@mgilson: Ben :) –

+0

(Bu btw hata sebebini eminim - Ama çok garip bir hatadır) başlamıştı – mgilson