SciPy/NumPy导入指南

12

注意:我查了重复问题,但没有找到能清晰回答我的问题的内容。如果我漏看了什么,请务必告诉我!

为了整理我的代码,我一直在寻找导入SciPy和NumPy的标准规范。我知道没有严格的指南,我可以按照自己的方式操作,但有时我仍然会发现相互矛盾的指令。

例如,我曾经在某个地方读到,NumPy只用于实现数组对象,而SciPy则用于其他所有科学算法。因此,应该使用NumPy进行数组操作,使用SciPy进行其他操作...另一方面,SciPy在其主命名空间中导入了所有Numpy函数,因此scipy.array()numpy.array()是一样的(细节请见这个问题),因此仅当不使用SciPy时才应使用NumPy,因为它们是重复的...

使用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的数组操作?


3
建议直接从numpy.lib.scimath获取这些函数的变体,因为它们在那里被定义,而不是从scipy获取。 - Robert Kern
3个回答

6
我建议做类似于以下的操作:
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两个库是多余的,因为numpy已经包含在scipy中了,而且scipy更适合科学计算。 - PhilMacKay
1
然后只需要导入 scipy,但不要使用 from scipy import * - Johan Råde
我选择了您的答案,因为没有其他需要补充的内容。在我的情况下,由于我一直在进行科学计算,所以我只使用import scipy as sp进行测试,并且对于所有事情都使用sp.stuff。在更普遍的计算环境中,不需要scipy,我想numpy可能是最好的选择。我想不出两者同时需要的情况。 - PhilMacKay
import scipy as sp 的问题在于许多子模块将不可用。例如,sp.sparse 不可用。有什么办法可以全部导入吗? - Royi

1

这篇文章提供了关于两个模块的一些好信息(Scipy和Numpy之间的关系)。看起来,Numpy的功能旨在完全包含在Scipy中,尽管有一些例外情况(请参见文章)。我认为,只需使用Scipy就可以满足您的所有需求,因为大多数重要的东西,如数学函数、数组和其他东西都包含在Scipy中。


0

如果只使用所需内容,可以考虑创建类,例如:

class one:

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)

我不知道这是否是你正在寻找的,但这种方法可以使代码非常清晰,并且很容易添加更多功能。


1
嗯,您回答的是哪个问题? - MattDMo
嗯...这不是我想要的。我的主要目标是尽可能保持代码易于阅读和简单,因为我希望其他人(或者一年后的自己)能够轻松理解我的算法。 - PhilMacKay
我明白你的意思,但是由于在图像处理中需要两种类型的数组,我认为这样做是使代码更易于阅读的最简单方法。 - Jorge Y. C. Rodriguez

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