O SciPy parece fornecer a maioria (mas não todas [1]) das funções do NumPy em seu próprio espaço de nome. Em outras palavras, se houver uma função chamada numpy.foo
, certamente haverá umascipy.foo
. Na maioria das vezes, os dois parecem exatamente iguais, muitas vezes até apontando para o mesmo objeto de função.
Às vezes são diferentes. Para dar um exemplo que surgiu recentemente:
numpy.log10
é um ufunc que retorna NaNs para argumentos negativos;scipy.log10
retorna valores complexos para argumentos negativos e não parece ser um problema.
O mesmo pode ser dito sobre log
, log2
e logn
, mas não sobrelog1p
[2].
Por outro lado, numpy.exp
e scipy.exp
parecem ter nomes diferentes para o mesmo nome. Isto também é verdade scipy.log1p
enumpy.log1p
.
Outro exemplo é numpy.linalg.solve
vsscipy.linalg.solve
. Eles são semelhantes, mas o último oferece alguns recursos adicionais sobre o primeiro.
Por que a aparente duplicação? Se isso é uma importação de atacado numpy
para o scipy
espaço para nome, por que as diferenças sutis de comportamento e as funções ausentes? Existe alguma lógica abrangente que ajudaria a esclarecer a confusão?
[1] numpy.min
, numpy.max
, numpy.abs
e alguns outros não têm contrapartida no scipy
namespace.
[2] Testado usando o NumPy 1.5.1 e 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
. Agora eu me pergunto, porque sigo um pouco as mensagens sobre entorpecido e covarde e o uso sozinho. E quase sempre vejo o numpy sendo importado separadamente (como np). Então eles falharam?Respostas:
A última vez que o verifiquei, o
__init__
método scipy executa umpara que todo o espaço para nome numpy seja incluído no scipy quando o módulo scipy for importado.
O
log10
comportamento que você está descrevendo é interessante, porque as duas versões são provenientes de numpy. Um é aufunc
, o outro é umanumpy.lib
função. Por que scipy está preferindo a função de biblioteca ao invés deufunc
, eu não sei de nada.EDIT: Na verdade, eu posso responder à
log10
pergunta. Olhando no__init__
método scipy , vejo o seguinte:A
log10
função que você obtém no scipy vemnumpy.lib.scimath
. Olhando para esse código, ele diz:Parece que o módulo sobrepõe as ufuncs base de numpy para
sqrt
,log
,log2
,logn
,log10
,power
,arccos
,arcsin
, earctanh
. Isso explica o comportamento que você está vendo. A razão subjacente ao design por que isso é feito provavelmente está enterrada em uma postagem da lista de emails em algum lugar.fonte
No Guia de Referência SciPy:
A intenção é que os usuários não precisem saber a distinção entre os namespaces
scipy
enumpy
, embora aparentemente você tenha encontrado uma exceção.fonte
Parece que, nas perguntas frequentes do SciPy, algumas funções do NumPy estão aqui por razões históricas, enquanto deveriam estar apenas no SciPy:
Isso explica por que
scipy.linalg.solve
oferece alguns recursos adicionaisnumpy.linalg.solve
.Não vi a resposta de SethMMorton para a pergunta relacionada
fonte
Há um breve comentário no final da introdução à documentação do SciPy :
Eu acho que isso permitirá que alguém com conhecimento suficiente de todos os pacotes envolvidos escolha exatamente quais são as diferenças entre algumas funções enganosas e numpy (isso não me ajudou em nada com a pergunta log10). Definitivamente não tenho esse conhecimento, mas
source
indica issoscipy.linalg.solve
enumpy.linalg.solve
interajo com o lapack de maneiras diferentes;Este também é o meu primeiro post, por isso, se eu mudar alguma coisa aqui, por favor me avise.
fonte
Da Wikipedia ( http://en.wikipedia.org/wiki/NumPy#History ):
scipy
dependenumpy
e importa muitasnumpy
funções para seu espaço de nome por conveniência.fonte
Em relação ao pacote linalg - as funções scipy chamarão lapack e blas, que estão disponíveis em versões altamente otimizadas em muitas plataformas e oferecem desempenho muito bom, principalmente para operações em matrizes densas razoavelmente grandes. Por outro lado, não são fáceis de compilar bibliotecas, exigindo um compilador fortran e muitos ajustes específicos da plataforma para obter desempenho total. Portanto, o numpy fornece implementações simples de muitas funções comuns de álgebra linear, que geralmente são boas o suficiente para muitos propósitos.
fonte
dual
: "Este módulo deve ser usado para funções tanto em numpy quanto em scipy, se você quiser usar a versão numpy, se disponível, mas a versão scipy, caso contrário." Uso ---from numpy.dual import fft, inv
Das palestras sobre ' Economia Quantitativa '
O SciPy é um pacote que contém várias ferramentas criadas sobre o NumPy, usando seu tipo de dados de matriz e funcionalidade relacionada
De fato, quando importamos o SciPy, também obtemos o NumPy, como pode ser visto no arquivo de inicialização do SciPy
No entanto, é mais comum e melhor prática usar a funcionalidade NumPy explicitamente
O que é útil no SciPy é a funcionalidade em seus subpacotes
fonte
Além das perguntas frequentes sobre o SciPy, que descrevem a duplicação principalmente para compatibilidade com versões anteriores, é esclarecido na documentação do NumPy que
Por uma questão de brevidade, são eles:
Além disso, no Tutorial SciPy :
Portanto, para novos aplicativos, você deve preferir a versão NumPy das operações da matriz duplicadas no nível superior do SciPy. Para os domínios listados acima, você deve preferir os do SciPy e verificar a compatibilidade com versões anteriores, se necessário, no NumPy.
Na minha experiência pessoal, a maioria das funções de matriz que utilizo existe no nível superior do NumPy (exceto por
random
). No entanto, todas as rotinas específicas de domínio existem nos subpacotes do SciPy, portanto, raramente uso algo do nível superior do SciPy.fonte