SciPy/NumPy 导入指南

Posted

技术标签:

【中文标题】SciPy/NumPy 导入指南【英文标题】:SciPy/NumPy import guideline 【发布时间】:2013-03-09 20:50:11 【问题描述】:

注意:我检查了重复项,但没有任何内容可以明确回答我的问题。我相信如果我遗漏了什么,你会告诉我的!

为了清理我的代码,我一直在寻找在我的程序中导入 SciPy 和 NumPy 的标准约定。我知道没有严格的指导方针,我可以按照自己的方式去做,但有时我仍然会发现相互矛盾的指示。

例如,我在某处读到 NumPy 仅用于实现数组对象,而 SciPy 则适用于所有其他科学算法。所以 NumPy 应该用于数组操作,而 SciPy 应该用于其他一切...... 另一方面,SciPy 在其主命名空间中导入每个 Numpy 函数,因此 scipy.array()numpy.array() (see this question) 相同,因此 NumPy 仅应在不使用 SciPy 时使用,因为它们是重复...

使用 SciPy 和 NumPy 的推荐方法是什么?作为一名科学家,sqrt(-1) 应该返回一个复数,所以我倾向于只使用 SciPy。

现在,我的代码开始于:

import numpy as np
from scipy import *
from matplotlib import pyplot as plt

我使用 scipy 进行数学运算(例如 log10()),使用 numpy 进行数组创建/操作(例如 np.zeros())。一直使用 SciPy 并且从不明确导入 NumPy 会很好吗?未来的更新会从 SciPy 中移除 NumPy 的数组操作吗?

【问题讨论】:

我建议直接从定义它们的numpy.lib.scimath 获取这些函数的变体,而不是从 scipy 获取。 【参考方案1】:

我建议做类似的事情

import numpy as np
import scipy as sp

相反。做from ... import * 总是很危险的,尤其是对于像numpyscipy 这样的大模块。以下说明了原因:

>>> any(['foo'])
True
>>> from scipy import *
>>> any(['foo'])

Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
     any(['foo'])
  File "C:\Python27\lib\site-packages\numpy\core\fromnumeric.py", line 1575, in any
    return _wrapit(a, 'any', axis, out)
  File "C:\Python27\lib\site-packages\numpy\core\fromnumeric.py", line 37, in _wrapit
    result = getattr(asarray(obj),method)(*args, **kwds)
TypeError: cannot perform reduce with flexible type

这里发生了什么?标准的 python 内置函数 anyscipy.any 替换,它具有不同的行为。这可能会破坏任何使用标准 any 的代码。

【讨论】:

我遇到了from ... import * 的危险,但是同时导入 scipy 和 numpy 是多余的,因为 scipy 中包含 numpy,并且 scipy 更适合科学计算。 然后只导入scipy,但不要导入from scipy import * 我选择了你的答案,因为几乎没有什么要补充的。就我而言,由于我一直在做科学计算,所以我只使用import scipy as sp 进行测试,并使用sp.stuff 进行所有测试。在不需要 scipy 的更一般的计算环境中,我想 numpy 将是要走的路。我想不出同时需要两者的情况。 import scipy as sp 的问题是很多子模块不可用。例如,sp.sparse 不可用。知道如何将它们全部导入吗?【参考方案2】:

这篇文章有一些关于这两个模块的好信息 (Relationship between scipy and numpy)。 Numpy 的功能似乎完全包含在 Scipy 中,尽管有一些例外(见帖子)。我想说简单地使用 Scipy 来满足您的所有需求是安全的,因为最重要的东西,如数学函数、数组和其他东西都包含在 Scipy 中。

【讨论】:

【参考方案3】:

如何制作课程并使用您需要的东西,fx: 第一课:

import cv2
from SIGBWindows import SIGBWindows
from SIGBAssg import *

二级:

import cv2
import numpy as np

from pylab import *
from scipy.cluster.vq import *
from scipy.misc import imresize

第三类:

import cv2
import numpy as np

最后我们调用对象的地方:

import cv2
from SIGBWindows import SIGBWindows
from SIGBAssg import *

windows = SIGBWindows(mode="video")
windows.openVideo("somevideo.avi")
kmeans(windows)

我不知道它是不是你要找的东西,但是这种方法使代码非常干净并且很容易向它添加更多功能。

【讨论】:

嗯,你在回答什么问题? 嗯...这不是我想要的。我的主要目标是使代码尽可能易于阅读和简单,因为我希望其他人(或一年后的我自己)能够轻松理解我的算法。 是的,我跟着你,但由于图像处理需要这两种数组,我认为这样做是使代码更易于阅读的最简单方法。

以上是关于SciPy/NumPy 导入指南的主要内容,如果未能解决你的问题,请参考以下文章

Python 中的二阶导数 - scipy/numpy/pandas

指南针,添加导入路径

Rails 3 应用程序中的 Sass 导入错误 - “找不到或无法读取要导入的文件:指南针”

没有导入的 SASS 用户选择混合 - 指南针

找不到或无法读取要导入的文件:指南针

Scipy/Numpy/scikits - 基于两个数组计算精度/召回分数