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

nnn*_*mmm 5 python numpy matplotlib python-2.7

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

import numpy as np 
import matplotlib.pyplot as plt # adding this line breaks things
import sys
Run Code Online (Sandbox Code Playgroud)

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

我的第一个想法是它可能是名称冲突,但事实并非如此.您可以很容易地看到代码没有任何名为"plt"的内容,此外,它与下面描述的行为不一致.

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

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

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

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

ali*_*i_m 2

我无法重现您所看到的错误*,因此我很难查明原因。话虽如此,代码中数值不稳定的一个明显来源是第 39 行的矩阵求逆操作。

在实践中,很少有需要反转矩阵的情况。特别是,您永远不应该使用矩阵求逆来求解线性方程组- 使用因式分解总是更快、更稳定。

您可以将您的呼叫替换np.linalg.invnp.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
Run Code Online (Sandbox Code Playgroud)

看看这是否有助于解决您的稳定性问题。


更新

您在上面的评论中提到您的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。