SciPy似乎在其自己的名称空间中提供了NumPy的大多数(但不是全部[1])功能。换句话说,如果有一个名为的函数numpy.foo,几乎可以肯定有一个scipy.foo。在大多数情况下,两者看起来是完全相同的,甚至有时指向相同的功能对象。
numpy.foo
scipy.foo
有时,它们是不同的。举一个最近出现的例子:
numpy.log10
scipy.log10
同样可以说,大约log,log2和logn,但不是关于log1p[2]。
log
log2
logn
log1p
另一方面,对于相同的ufunc numpy.exp,它们scipy.exp似乎是不同的名称。scipy.log1p和的情况也是如此numpy.log1p。
numpy.exp
scipy.exp
scipy.log1p
numpy.log1p
另一个例子是numpy.linalg.solveVS scipy.linalg.solve。它们相似,但是后者比前者提供了一些附加功能。
numpy.linalg.solve
scipy.linalg.solve
为什么出现明显的重复?如果这意味着要的批发进口numpy到scipy命名空间,为什么在行为的细微差别和缺少的功能?是否有一些有助于消除混乱的总体逻辑?
numpy
scipy
[1] ,,和其他几个人都在没有同行的命名空间。numpy.min``numpy.max``numpy.abs``scipy
numpy.min``numpy.max``numpy.abs``scipy
[2]使用NumPy 1.5.1和SciPy 0.9.0rc2进行了测试。
上次我检查它时,scipy__init__方法执行
__init__
from numpy import *
以便在导入scipy模块时将整个numpy命名空间包含到scipy中。
log10您描述的行为很有趣,因为 两个 版本都来自numpy。一个是a ufunc,另一个是numpy.lib功能。为什么scipy偏爱库函数而不是ufunc,我不知道该怎么办。
log10
ufunc
numpy.lib
编辑:事实上,我可以回答这个log10问题。在scipy__init__方法中,我看到以下内容:
# Import numpy symbols to scipy name space import numpy as _num from numpy import oldnumeric from numpy import * from numpy.random import rand, randn from numpy.fft import fft, ifft from numpy.lib.scimath import *
log10您获得scipy的功能来自numpy.lib.scimath。查看该代码,它说:
numpy.lib.scimath
""" Wrapper functions to more user-friendly calling of certain math functions whose output data-type is different than the input data-type in certain domains of the input. For example, for functions like log() with branch cuts, the versions in this module provide the mathematically valid answers in the complex plane: >>> import math >>> from numpy.lib import scimath >>> scimath.log(-math.exp(1)) == (1+1j*math.pi) True Similarly, sqrt(), other base logarithms, power() and trig functions are correctly handled. See their respective docstrings for specific examples. """
看来模块覆盖了基础numpy的ufuncs sqrt,log,log2,logn,log10,power,arccos,arcsin,和arctanh。这就解释了您所看到的行为。这样做的根本设计原因可能埋在某个地方的邮件列表中。
sqrt
power
arccos
arcsin
arctanh