numpy/python数值不稳定性问题将大数组倍增



我已经创建了一个函数,可以通过quaternion旋转向量:

def QVrotate_toLocal(Quaternion,Vector):
    #NumSamples x Quaternion[w,x,y,z]
    #NumSamples x Vector[x,y,z]
    #For example shape (20000000,4) with range 0,1
    #            shape (20000000,3) with range -100,100
    #All numbers are float 64s 
    Quaternion[:,2]*=-1
    x,y,z=QuatVectorRotate(Quaternion,Vector)
    norm=np.linalg.norm(Quaternion,axis=1)
    x*=(1/norm)
    y*=(1/norm)
    z*=(1/norm)
    return np.stack([x,y,z],axis=1)

quatvectorrotate中的所有内容都是(20000000,1(numpy阵列的添加和乘法

对于我拥有的数据(四季度和向量的2000万样品(,每次我运行代码时,解决方案都会在(已知的(正确解决方案和非常不正确的解决方案之间振荡。切勿偏离模式正确,不正确,正确,不正确...

静态代码中的这种数值振荡通常意味着正在操作的矩阵不良,python耗尽了浮点精度,或者在某个地方有一个无声的内存溢出。

我的代码中几乎没有线性代数,我已经检查并发现每次运行时的标准线是静态的。这个问题似乎正在行a = ... to d = ...

中发生。

这使我相信,鉴于这些大型阵列我沿线某个地方的内存耗尽。这仍然可能是问题,但我不相信是。我有16GB的内存,在运行时,我从未获得超过75%的使用。但同样,我对内存分配还不够了解,无法明确地排除这一点。我试图在功能的开始和结束时强制垃圾收集无济于事。

任何想法都将不胜感激。

编辑:

我刚刚通过以下数据重现了此问题,并观察到相同的行为。

Q=np.random.random((20000000,4))
V=np.random.random((20000000,3))

在第一行中进行Quaternion[:,2]*=-1时,您正在突变Quaternion数组。这不是该数组的本地副本,而是您从外部传递的实际数组。

因此,每次运行此代码时,您都会在这些元素上有不同的符号。在运行两次功能后,该数组又回到了开始(显然是-1*-1 = 1(。

解决此问题的一种方法是首先制作本地副本:

Quaternion_temp = Quaternion.copy()

相关内容

  • 没有找到相关文章

最新更新