大型组件的矢量幅度
vector magnitude for large components
我注意到 numpy 有一个内置函数 linalg.norm(vector),它产生大小。对于小值,我得到所需的输出
>>> import numpy as np
>>> np.linalg.norm([0,2])
2.0
但是对于大值:
>>> np.linalg.norm([0,149600000000])
2063840737.6330884
这是一个巨大的错误,我该怎么办呢?制作我自己的函数似乎会产生同样的错误。这里有什么问题,舍入误差这么大吗?我该怎么办?
您的号码写成整数,但它太大了 numpy.int32
装不下。这个问题似乎甚至在 python3 中也会发生,其中
本地数字很大。
在数字工作中,我尽量让所有东西都变成浮点数,除非它是一个索引。所以我尝试了:
In [3]: np.linalg.norm([0.0,149600000000.0])
Out[3]: 149600000000.0
详细说明:在这种情况下,添加 .0
是将整数转换为双精度数的简单方法。在更实际的代码中,您可能有不确定类型的传入数据。最安全(但并不总是正确)的做法是在函数顶部强制转换为浮点数组。
def do_something_with_array(arr):
arr = np.double(arr) # or np.float32 if you prefer.
... do something ...
我注意到 numpy 有一个内置函数 linalg.norm(vector),它产生大小。对于小值,我得到所需的输出
>>> import numpy as np
>>> np.linalg.norm([0,2])
2.0
但是对于大值:
>>> np.linalg.norm([0,149600000000])
2063840737.6330884
这是一个巨大的错误,我该怎么办呢?制作我自己的函数似乎会产生同样的错误。这里有什么问题,舍入误差这么大吗?我该怎么办?
您的号码写成整数,但它太大了 numpy.int32
装不下。这个问题似乎甚至在 python3 中也会发生,其中
本地数字很大。
在数字工作中,我尽量让所有东西都变成浮点数,除非它是一个索引。所以我尝试了:
In [3]: np.linalg.norm([0.0,149600000000.0])
Out[3]: 149600000000.0
详细说明:在这种情况下,添加 .0
是将整数转换为双精度数的简单方法。在更实际的代码中,您可能有不确定类型的传入数据。最安全(但并不总是正确)的做法是在函数顶部强制转换为浮点数组。
def do_something_with_array(arr):
arr = np.double(arr) # or np.float32 if you prefer.
... do something ...