SciPy parece proporcionar la mayoría (pero no todas [1]) de las funciones de NumPy en su propio espacio de nombres. En otras palabras, si hay una función nombrada numpy.foo
, es casi seguro que a scipy.foo
. La mayoría de las veces, los dos parecen ser exactamente iguales, y muchas veces incluso apuntan al mismo objeto de función.
A veces son diferentes. Para dar un ejemplo que surgió recientemente:
numpy.log10
es un ufunc que devuelve NaNs para argumentos negativos;scipy.log10
devuelve valores complejos para argumentos negativos y no parece ser un ufunc.
Lo mismo puede decirse sobre log
, log2
y logn
, pero no sobre log1p
[2].
Por otro lado, numpy.exp
y scipy.exp
parecen ser nombres diferentes para el mismo ufunc. Esto también es cierto de scipy.log1p
y numpy.log1p
.
Otro ejemplo es numpy.linalg.solve
vs scipy.linalg.solve
. Son similares, pero este último ofrece algunas características adicionales sobre el primero.
¿Por qué la aparente duplicación? Si se supone que esto es una importación total numpy
en el scipy
espacio de nombres, ¿por qué las sutiles diferencias de comportamiento y las funciones que faltan? ¿Existe alguna lógica general que ayudaría a aclarar la confusión?
[1] numpy.min
, numpy.max
, numpy.abs
y algunos otros no tienen homólogos en el scipy
espacio de nombres.
[2] Probado con NumPy 1.5.1 y SciPy 0.9.0rc2.
all of those functions are available without additionally importing Numpy
porquethe intention is for users not to have to know the distinction between the scipy and numpy namespaces
. Ahora me pregunto, porque sigo un poco las publicaciones sobre numpy y scipy y lo uso yo mismo. Y casi siempre veo que numpy se importa por separado (como np). ¿Entonces fallaron?Respuestas:
La última vez que lo revisé, el
__init__
método scipy ejecuta unpara que todo el espacio de nombres numpy se incluya en scipy cuando se importe el módulo scipy.
El
log10
comportamiento que está describiendo es interesante, porque ambas versiones provienen de numpy. Uno es unufunc
, el otro es unanumpy.lib
función. Por qué scipy prefiere la función de biblioteca sobreufunc
, no lo sé.EDITAR: De hecho, puedo responder la
log10
pregunta. Mirando en el__init__
método scipy veo esto:La
log10
función que obtienes en scipy provienenumpy.lib.scimath
. Mirando ese código, dice:Parece que las superposiciones de los módulos ufuncs numpy de base para
sqrt
,log
,log2
,logn
,log10
,power
,arccos
,arcsin
, yarctanh
. Eso explica el comportamiento que estás viendo. La razón de diseño subyacente por la que se hace así probablemente está enterrada en una publicación de la lista de correo en alguna parte.fuente
De la Guía de referencia de SciPy:
La intención es que los usuarios no tengan que conocer la distinción entre los espacios de nombres
scipy
ynumpy
, aunque aparentemente han encontrado una excepción.fuente
Según las preguntas frecuentes de SciPy, algunas funciones de NumPy están aquí por razones históricas, mientras que solo deberían estar en SciPy:
Eso explica por qué
scipy.linalg.solve
ofrece algunas características adicionalesnumpy.linalg.solve
.No vi la respuesta de SethMMorton a la pregunta relacionada
fuente
Hay un breve comentario al final de la introducción a la documentación de SciPy :
Creo que esto permitirá que alguien con suficiente conocimiento de todos los paquetes involucrados separe exactamente cuáles son las diferencias entre algunas funciones escritas y numpy (no me ayudó en absoluto con la pregunta log10). Definitivamente no tengo ese conocimiento, pero
source
sí lo indicoscipy.linalg.solve
enumpy.linalg.solve
interactúo con lapack de diferentes maneras;Esta es también mi primera publicación, así que si debo cambiar algo aquí, avísenme.
fuente
De Wikipedia ( http://en.wikipedia.org/wiki/NumPy#History ):
scipy
dependenumpy
e importa muchasnumpy
funciones en su espacio de nombres por conveniencia.fuente
Con respecto al paquete linalg, las funciones scipy llamarán lapack y blas, que están disponibles en versiones altamente optimizadas en muchas plataformas y ofrecen un rendimiento muy bueno, particularmente para operaciones en matrices densas razonablemente grandes. Por otro lado, no son bibliotecas fáciles de compilar, que requieren un compilador fortran y muchos ajustes específicos de la plataforma para obtener un rendimiento completo. Por lo tanto, numpy proporciona implementaciones simples de muchas funciones comunes de álgebra lineal que a menudo son lo suficientemente buenas para muchos propósitos.
fuente
dual
: "Este módulo debe usarse para funciones tanto en numpy como scipy si desea utilizar la versión numpy si está disponible, pero la versión scipy de lo contrario". Uso ---from numpy.dual import fft, inv
De conferencias sobre ' economía cuantitativa '
SciPy es un paquete que contiene varias herramientas que se construyen sobre NumPy, utilizando su tipo de datos de matriz y funcionalidad relacionada
De hecho, cuando importamos SciPy también obtenemos NumPy, como se puede ver en el archivo de inicialización de SciPy
Sin embargo, es más común y una mejor práctica usar la funcionalidad NumPy explícitamente
Lo que es útil en SciPy es la funcionalidad en sus subpaquetes
fuente
Además de las preguntas frecuentes de SciPy que describen la duplicación principalmente para la compatibilidad con versiones anteriores, se aclara en la documentación de NumPy para decir que
Por brevedad, estos son:
Además, del Tutorial SciPy :
Por lo tanto, para nuevas aplicaciones, debe preferir la versión NumPy de las operaciones de matriz que se duplican en el nivel superior de SciPy. Para los dominios enumerados anteriormente, debe preferir aquellos en SciPy y verificar la compatibilidad con versiones anteriores si es necesario en NumPy.
En mi experiencia personal, la mayoría de las funciones de matriz que uso existen en el nivel superior de NumPy (a excepción de
random
). Sin embargo, todas las rutinas específicas de dominio existen en subpaquetes de SciPy, por lo que rara vez uso algo del nivel superior de SciPy.fuente