2013-03-13 7 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 

hh ... AttributeError: sqrt何が起こっているのですか? math.sqrtに同じ問題はないようです。大きな整数のためのnp.sqrtの奇妙な振る舞い

+4

ここで新しいことを学びました。投稿ありがとう! – mgilson

答えて

8

最終的な数は、numpyのは、明らかに扱うことができないlong(任意精度整数のためのPythonの名前)です。

>>> 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のは、そうでないタイプを見るためAttributeErrorが発生どのように処理するかを知っていて、デフォルトではオブジェクトのメソッドsqrtを呼び出します。しかしそれは存在しません。したがって、それはnumpy.sqrtではなく、long.sqrtです。対照的に、math.sqrtは約longを知っている。あなたがNumPyで非常に大きな数字に対処するつもりなら、いつでも浮動小数点を使用してください。

EDIT:そのバージョンでintlonghas disappearedの区別は、numpyのは、まだ成功しPyLong_AsLongを使用してC longに変換することができPyLongObjectの違いに敏感ですがさてさて、あなたは、Python 3を使用しています1つはできない。

+1

しかし、しかし、しかし、それは 'AttributeError'を説明していません...どうして' numpy'名前空間から 'sqrt'をどうやって削除するのですか?それはバグでなければなりません... – mgilson

+0

@mgilson:私はそれになっていました。 –

+0

(これはエラーの理由です - しかし、それは非常に奇妙なエラーです) – mgilson