>>> 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
嗯... AttributeError: sqrt
这里发生了什么? math.sqrt
似乎没有同样的问题。
答案 0 :(得分:8)
最终的数字是long
(任意精度整数的Python名称),NumPy显然无法处理:
>>> 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
发生AttributeError
是因为NumPy看到一个不知道如何处理的类型,默认调用对象上的sqrt
方法;但那不存在。所以它不是numpy.sqrt
,而是long.sqrt
。
相比之下,math.sqrt
知道long
。如果您要在NumPy中处理非常大的数字,请尽可能使用浮点数。
编辑:好的,你正在使用Python 3.虽然该版本中int
和long
has disappeared之间存在区别,但NumPy仍然对可以使用PyLongObject
成功转换为C long
的{{3}}与不能成功转换为{{1}}的内容之间的差异。