2015-01-02 9 views
7

Sto usando scipy e numpy tramite la distribuzione di Anaconda 2.1.0. Uso Spyder come IDE Python.Differenze nell'importazione di moduli/pacchetti secondari di pacchetti numpy e Scipy

Quando eseguo import scipy as sp, io non riesco ad accedere a pacchetti secondari, come ottimizzare, linalg, gruppo etc. attraverso sp.

Tuttavia, quando corro import numpy as np, sono in grado di accedere a tutti i suoi sottopacchetti, come ad esempio linalg, random, matrixlib, polynomial, testing, ecc. tramite np.

C'è una ragione per cui le due importazioni funzionano in modi diversi? Perché lo import scipy as sp non carica tutti i sottopacchetti scipy nel namespace sp?

+0

Questa è davvero una domanda interessante. La cosa divertente è: dopo "import scipy as sp' digitando" sp.optimize "ti daremo un errore. Ma se lo fai 'da scipy import optimize', all'improvviso' sp.optimize' non ti darà più errori. Questo problema non è specifico per anaconda. – cel

+2

@cel, non si ottiene più l'errore perché quando si digita 'da scipy import optimize', l'interprete si rende conto che ha già caricato il pacchetto principale' scipy', e importerà il sottomodulo 'optimize' all'interno di quello già modulo caricato. L'identificatore 'sp' sta puntando a quello stesso modulo di prima che ora è 'aggiornato', così ora puoi accedere al sottomodulo' optimize' anche attraverso l'identificatore. – gg349

+0

@ gg349, oh questo ha senso - non lo sapevo :) – cel

risposta

5

Questa possibilità di diverso comportamento di importazione si verifica in base alla progettazione del linguaggio Python.

Una dichiarazione di importazione di un modulo (*) di default importa solo il modulo principale e non i sottomoduli. Il modulo principale può (come nel caso di numpy) o non può (come scipy) importare alcuni o tutti i sottomoduli.

La ragione di ciò è esemplificata da scipy: nella maggior parte dei casi, sarà necessario un solo sottomodulo del pacchetto scipy. Questo comportamento predefinito non sospenderà l'interprete durante il caricamento dei sottomoduli che non sono necessari per il codice.

EDIT: noti che numpy non importa per impostazione predefinita tutti i moduli, ad esempio, non viene caricato numpy.f2py, vedi THIS domanda/risposta per maggiori dettagli.

(*) qui intendo una dichiarazione di importazione come import scipy o import scipy as sp, in cui è caricato un modulo. Naturalmente se scrivi import scipy.optimize allora python caricherà prima il modulo principale e poi il sottomodulo.

+0

Grazie. Quindi, quale sarebbe una semplice espressione per caricare tutti i sottomoduli per qualsiasi modulo sotto qualsiasi identificatore che l'utente desidera? – user3317287

+0

C'è sicuramente un modo, ma è una cattiva idea. Importa solo i moduli necessari. Direi che se non sai in anticipo quali sottomoduli hai bisogno di un determinato modulo hai un problema più grande, nel senso che non sai cosa stai facendo – gg349

+0

potresti essere interessato a [ questo] (http://stackoverflow.com/questions/1707709/list-all-the-modules-that-are-part-of-a-python-package) domanda però – gg349