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

标签 python python-2.7 numpy matplotlib

我正在用 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 突然没有了 not-nan 值。此外,将 import sys 语句移动到 import numpy as np 之前会更改 nan 行数。在沿着这些方向进行的实验中,我观察到当多次执行同一个文件时,发生了变化(变化很大,例如从 77 到 3.32686992e+297),并且在进一步重复执行后又回到原始值,在这两个输出之间随机振荡。没有保存的状态,文件操作仅包含对 np.loadtxt 的一次调用。

可能有帮助的更多信息:我有 Python 2.7.6 和 Ubuntu 14.04,尽管在其他人的计算机上使用 Python 2.7.8 和 spyder 的行为是相似的。

此行为的可能来源是什么?现在,我在想要么是巫术,要么是我们两台计算机上巧合的神秘硬件故障,要么是一种旨在挫败 Python 程序员的邪恶病毒。

最佳答案

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

在实践中,很少有需要反转矩阵的情况。特别是,你应该 never use matrix inversion to solve systems of linear equations - 使用因式分解总是更快、数值更稳定。

您可以将对 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。

关于python - 导入 matplotlib.pyplot 时出现随机 nan 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28371017/

相关文章:

Python - 将文件内容转换为二进制数组

python - 为什么原始 numpy 数组在更新其副本后也会更新?

python - 如何将 "args=(...)"添加到我自己函数的参数中?

python - numpy 对数组段上的最大值进行向量化

python - 获取结果列表,每个外键 1 个

python - 错误 LNK2001 : unresolved external symbol PyInit_

java - SimpleDateFormat 解析 strftime 生成的日期时出现问题

python - 数据框中多列的计算

python - 在 python 中,如何在我选择的子字符串之前只搜索一个词

Python/Django : how does the ugettext_lazy function exactly work with operator %?