【问题标题】:Using Numpy in different platforms在不同平台上使用 Numpy
【发布时间】:2015-07-24 02:10:03
【问题描述】:

我有一段代码可以计算亥姆霍兹-霍奇分解。 我一直在我的 Mac OS Yosemite 上运行,它工作得很好。然而,一个月前,我的 Mac 变得很慢(它真的很旧),我选择购买新的笔记本电脑(Windows 8.1,戴尔)。

在安装完所有 Python 库等之后,我继续运行相同的代码(在 Git 中进行版本控制)。然后结果就很诡异了,和旧笔记本上得到的完全不同。

例如,我所做的是构造矩阵ab(真的很长的演算),然后我调用求解器:

s = numpy.linalg.solve(a, b)

这是返回 a(错误,与我在 Mac 中获得的结果不同,这是正确的)。

然后,我尝试使用:

s = scipy.linalg.solve(a, b)

程序以代码 0 退出,但在代码中间。 然后,我只是做了一个简单的测试:

print 'here1'
s = scipy.linalg.solve(a, b)
print 'here2'

而且here2 永远不会被打印出来。

我试过了:

print 'here1'
x, info = numpy.linalg.cg(a, b)
print 'here2'

同样的事情也会发生。

使用numpy.linalg.solve后我也试过检查解决方案:

print numpy.allclose(numpy.dot(a, s), b)

我得到了一个False (?!)。

我不知道发生了什么,如何找到解决方案,我只知道在我的 Mac 上运行相同的代码,但如果我能在其他平台上运行它会非常好。现在我陷入了这个问题(不再有 Mac)并且不知道原因。

最奇怪的是我在运行时警告上没有收到任何错误,根本没有任何反馈。

感谢您的帮助。

编辑:

Numpy 套装测试结果:

Scipy 套装测试结果:

【问题讨论】:

  • 您是否仔细检查了版本一致性?旧 Mac 上的版本与新计算机上的(可能)较新版本之间可能发生了一些变化。
  • 是的,@Ajean。我还在我的 Mac 中插入了一个笔式驱动器,以获取旧代码并在 Mac 和 Windows 系统上重新运行它。它工作(Mac),但系统太慢,所以我真的很想让它在 Windows 上运行。这似乎根本没有意义。
  • 如果det(b)=0,即使由于精度损失,也意味着您的问题没有很好地定义。与条件恶劣的矩阵问题作斗争并不是正确的方法。
  • 感觉这更多是由于 numpy、scipy 版本的变化而不是 Mac/Windows 的差异。还可以尝试在 Mac 和 Windows 上运行 numpy/scipy 测试套件并比较结果。该程序存在于scipy.linalg.solve 上的事实看起来像是一个段错误,请确保正确安装了 BLAS/LAPACK 库。
  • 其他需要检查的是作为 numpy 基础的库的版本。 BLAS、LAPACK 和许多其他已安装,并且 Windows 和 Mac 版本之间的构建可能在某些方面有所不同。你在 OSX 和 Windows 上使用了什么安装方法?

标签: python windows macos numpy floating-point-precision


【解决方案1】:

下载 Anaconda 包管理器

http://continuum.io/downloads

当你下载它时,它已经为你解决了 numpy 的所有依赖项。它安装在本地,可以在大多数平台上运行。

【讨论】:

    【解决方案2】:

    这并不是一个真正的答案,但this blog 详细讨论了拥有一个快速发展的 numpy 生态系统的问题,但以牺牲可重复性为代价。

    顺便问一下,你使用的是哪个版本的 numpy?最新 1.9 的 documentation 不会报告任何称为 cg 的方法作为您使用的方法...

    我建议使用此示例,以便您(和其他人)可以检查结果。

    >>> import numpy as np
    >>> import scipy.linalg
    >>> np.random.seed(123)
    >>> a = np.random.random(size=(10000, 10000))
    >>> b = np.random.random(size=(10000,))
    >>> s_np = np.linalg.solve(a, b)
    >>> s_sc = scipy.linalg.solve(a, b)
    >>> np.allclose(s_np,s_sc)
    >>> s_np
    array([-15.59186559,   7.08345804,   4.48174646, ..., -16.43310046,
        -8.81301553, -10.77509242])
    

    【讨论】:

    • 嗨@RamonCrehuet。我在上面的 cmets 中发布了版本。它们是 Scipy 和 Numpy 的最后一个。 cg 来自 Scipy。 docs.scipy.org/doc/scipy/reference/sparse.linalg.html
    • 我知道cg 在 scipy.sparse 中,但你似乎在调用一个 numpy 函数。请澄清这一点。
    • 我已经编辑了我的帖子以提出一个我们都可以测试的可重现示例。
    • 我无法在此处重现您的代码。我得到内存错误。但是,调用求解器时我有 4GB 的 RAM。
    【解决方案3】:

    我希望你能找到答案——未来的一个选择是为你的每个项目创建一个虚拟机,使用Docker。这使得易于携带。

    查看一篇很棒的文章 here 讨论 Docker 进行研究。

    【讨论】:

    • Docker 不创建虚拟机,它运行进程。由于主机内核和进程内核是共享的,这几乎肯定不会改变任何基本的平台行为。
    猜你喜欢
    • 2018-09-14
    • 1970-01-01
    • 2012-03-07
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多