Relationship between SciPy and NumPy
SciPy appears to provide most (but not all [1]) of NumPy's functions in its own namespace. In other words, if there's a function named numpy.foo
, there's almost certainly a scipy.foo
. Most of the time, the two appear to be exactly the same, oftentimes even pointing to the same function object.
Sometimes, they're different. To give an example that came up recently:
numpy.log10
is a ufunc that returns NaNs for negative arguments;scipy.log10
returns complex values for negative arguments and doesn't appear to be a ufunc.
The same can be said about log
, log2
and logn
, but not about log1p
[2].
On the other hand, numpy.exp
and scipy.exp
appear to be different names for the same ufunc. This is also true of scipy.log1p
and numpy.log1p
.
Another example is numpy.linalg.solve
vs scipy.linalg.solve
. They're similar, but the latter offers some additional features over the former.
Why the apparent duplication? If this is meant to be a wholesale import of numpy
into the scipy
namespace, why the subtle differences in behaviour and the missing functions? Is there some overarching logic that would help clear up the confusion?
[1] numpy.min
, numpy.max
, numpy.abs
and a few others have no counterparts in the scipy
namespace.
[2] Tested using NumPy 1.5.1 and SciPy 0.9.0rc2.