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

nnnm毫米

我在numpy中实现Kalman过滤器。它工作正常,除了当我导入matplotlib.pyplot以可视化结果时:

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

完整的代码在这里让我强调一点,在导入之前,它似乎可以正常工作;它会打印出一个100 x 2的合理数字数组。添加导入后,即使不使用pyplot的任何内容,特定行之后的所有行均为nan不属于数字nan都和以前一样。

我最初的想法是,这可能是名称冲突,但事实并非如此。您可以轻松地看到该代码没有任何名为“ plt”的内容,此外,它与下面描述的行为也不一致。

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

仅尝试调试使我更加困惑。我将打印语句添加到有问题的主循环迭代中,该循环最初仅提供nan矩阵。print yt但是,当我再添加一条语句时,打印nan突然没有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程序员的邪恶病毒。

ali_m

我无法重现您看到的错误*,因此很难确定原因。话虽如此,代码中数字不稳定性的一个明显来源就是第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

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


更新资料

您在上面的评论中提到您的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 lib。我还尝试了matplotlib v1.3.1和v1.5.x。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章