9
>>> 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似乎没有同样的问题。

4

1 回答 1

10

最后一个数字是一个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 中消失了,但 NumPy 仍然对PyLongObject可以成功转换为 C longusingPyLong_AsLong和不能成功转换的 C 之间的区别很敏感。

于 2013-03-13T16:26:11.773 回答