在不同平台上使用Numpy

15

我有一段计算Helmholtz-Hodge分解的代码,在我的Mac OS Yosemite上运行得很好。一个月前,我的Mac变得非常缓慢(它真的很旧),于是我选择购买了一台新的笔记本电脑(Windows 8.1,Dell)。

安装完所有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套件测试结果:

enter image description here

Scipy套件测试结果:

enter image description here


1
你有没有仔细检查版本一致性?也许在你的旧 Mac 上和新电脑上(可能是更新版本)之间发生了一些变化。 - Ajean
2
如果det(b)=0,即使由于精度丢失而产生,这意味着您的问题没有被明确定义。对抗糟糕条件下的矩阵问题并不是正确的解决方式。 - Juh_
1
这更像是由于numpy、scipy版本的更改而不是Mac/Windows之间的差异造成的。同时尝试在 Mac 和 Windows 上运行numpy/scipy测试套件并比较结果。scipy.linalg.solve 函数崩溃的事实似乎像一个段错误,请确保BLAS/LAPACK库已正确安装。 - rth
如果您还没有这样做,那么将此报告为numpy bug可能是值得的。 - Jörn Hees
2
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Mike Sandford
显示剩余15条评论
3个回答

1

下载Anaconda软件包管理器

http://continuum.io/downloads

当您下载此文件时,它已经为您解决了所有numpy的依赖关系。它会在本地安装,并且可以在大多数平台上运行。

0

这并不是一个真正的答案,但这篇博客详细讨论了numpy生态系统快速发展而牺牲可重复性的问题。

顺便问一下,你使用的是哪个版本的numpy?最新的1.9 文档没有报告任何名为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。我在上面的评论中发布了版本。 它们是Scipy和Numpy的最新版本。cg来自Scipy。docs.scipy.org/doc/scipy/reference/sparse.linalg.html - pceccon
我知道cgscipy.sparse中,但你似乎在调用一个numpy函数。请澄清一下。 - Ramon Crehuet
我已编辑我的帖子,提供了一个我们都可以测试的可重现示例。 - Ramon Crehuet
我在这里无法重现你的代码。我得到了内存错误。然而,在调用求解器时,我有4GB的RAM。 - pceccon

0

希望你能找到答案 - 未来的一个选项是为每个项目创建一个虚拟机,使用Docker。这样可以轻松地实现可移植性。

这里看到一篇关于研究中使用Docker的好文章。


Docker不会创建虚拟机,它运行进程。由于主机内核和进程内核是共享的,这几乎肯定不会改变任何基本平台行为。 - GManNickG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接