首页 文章

导入matplotlib.pyplot时出现随机的nan错误

提问于
浏览
5

我正在实现一个卡尔曼过滤器numpy . 它工作正常,除了我导入matplotlib.pyplot以显示结果时:

import numpy as np 
import matplotlib.pyplot as plt # adding this line breaks things
import sys

完整的代码是here . 让我强调一下,在我导入之前它似乎正常工作;它打印出100 x 2数组,这些数字似乎是合理的 . 添加导入后,即使不使用pyplot中的任何内容,特定行之后的所有行都是 nan . 不是 nan 的数字与之前相同 .

我的第一个想法是它可能是名称冲突,但事实并非如此 . 您可以很容易地看到the code doesn't have anything named "plt",此外,它与下面描述的行为不一致 .

当我从Sublime Text执行文件而不是从命令行执行文件时,或者在pyplot导入之前添加 import matplotlib as mpl 时, nan 行的数量不同 . 同样,非 nan 数字与正确运行的版本中的数字相同 .

试图调试只会让我更加困惑 . 我在主循环的有问题的迭代中添加了print语句,它首先只给出了 nan 矩阵 . 当我再添加一个语句 print yt 时,打印 nan 的矩阵突然没有 nan 值 . 此外,在 import numpy as np 之前移动 import sys 语句会更改 nan 行的数量 . 在沿着这些线的实验中,我观察到当多次执行相同的文件时,值发生了变化(很多,例如从77变为3.32686992e 297),并且在进一步重复执行时回到原始值,在这两者之间随机振荡输出 . 没有保存状态,文件操作仅包含对 np.loadtxt 的一次调用 .

可能有用的更多信息:我有Python 2.7.6和Ubuntu 14.04,虽然在其他人的计算机上使用Python 2.7.8和spyder,行为类似 .

这种行为可能有什么来源?现在,我正在考虑在我们的计算机上使用巫术,巧合的神秘硬件故障,或者是一种旨在挫败Python程序员的邪恶病毒 .

1 回答

  • 2

    我能够看到*,所以我很难确定原因 . 话虽如此,代码中数值不稳定的一个明显来源是line 39上的矩阵求逆运算 .

    实际上,您需要反转矩阵的情况很少 . 特别是,你应该使用因子分解,它总是更快,更稳定 .

    您可以将 np.linalg.inv 的调用替换为np.linalg.solve,如下所示:

    # aux_k = np.linalg.inv(psi.dot(sigmatt1[t]).dot(psi.T) + rmat)
    # k[t] = sigmatt1[t].dot(psi.T).dot(aux_k)
    
    A = psi.dot(sigmatt1[t]).dot(psi.T) + rmat
    B = sigmatt1[t].dot(psi.T)
    k[t] = np.linalg.solve(A, B.T).T
    

    看看这是否有助于您的稳定性问题 .


    更新

    你在上面的评论中提到你的 numpy.__version__ == '1.8.2' ,但你的 matplotlib.__version__numpy__ == '1.5' . 这可能意味着matplotlib是针对numpy的旧版本(可能是不兼容的)构建的(你是如何安装这些库的?) .

    我建议你尝试删除并重新安装matplotlib .


    *我尝试使用numpy v1.8.2和v1.10.0.dev-8bcb756,链接到源自源代码的OpenBLAS 0.2.12或来自Ubuntu存储库的标准CBLAS库 . 我也尝试了matplotlib v1.3.1和v1.5.x.

相关问题