2015-01-02 13 views
7

私はAnaconda 2.1.0ディストリビューションを通じてscipyとnumpyを使用しています。私は私のPython IDEとしてSpyderを使用します。私はimport scipy as spを実行するとnumpyとScipyパッケージのモジュール/サブパッケージのインポートの相違点

、私はimport numpy as npを実行すると、私のような、そのすべてのサブパッケージにアクセスすることができています、しかしsp.

経由など、クラスタ最適化、linalg、などのサブパッケージに、アクセスできません。 linalg、random、matrixlib、polynomial、testingなどをnpに渡します。

2つのインポートが異なる方法で動作する理由はありますか? import scipy as spは、すべてのscipyサブパッケージをspの名前空間に入れないのはなぜですか?

+0

これは本当に興味深い質問です。面白いことです: 'sp.optimize'と打ち込むと' import scipy as sp'の後にエラーが出ます。しかし、 'scipy import optimize'を実行した場合、' sp.optimize'は突然エラーになりません。この問題は、anacondaに固有の問題ではありません。 – cel

+2

@celの場合、 'scipy import optimize'と入力すると、インタープリターはメインパッケージ' scipy'を既にロードしていることを認識し、サブモジュール 'optimize'をすでにインポートしているのでロードされたモジュール。識別子 'sp'は以前と同じモジュールを指しています。これは現在 '更新'されているので、識別子を介してサブモジュール' optimize'にアクセスすることができます。 – gg349

+0

@ gg349、それは意味をなさない - 知らなかった: – cel

答えて

5

異なるインポート動作のこの可能性は、Python言語の設計によって発生します。

モジュール(*)のインポートステートメントは、デフォルトでサブモジュールではなくメインモジュールのみをインポートします。メインモジュールは(numpyの場合のように)、サブモジュールの一部またはすべてをインポートすることができません(scipyなど)。

これは、scipyで示されています。ほとんどの場合、scipyパッケージのサブモジュールは1つだけ必要です。このデフォルトの動作では、コードに不要なサブモジュールを読み込む際にインタプリタがハングしません。

EDIT:numpyは、デフォルトでは、すべてのサブモジュールをインポートしていないことに注意してください 、例えば、それはより多くの詳細については、THIS質問/回答を参照してくださいnumpy.f2pyをロードしません。

(*)ここでは、モジュールがロードされるimport scipyまたはimport scipy as spのようなインポートステートメントを意味します。もちろん、import scipy.optimizeと書くと、pythonは最初にメインモジュールをロードし、次にサブモジュールをロードします。

+0

ありがとうございます。だから、ユーザーが望む任意の識別子のもとでモジュールのすべてのサブモジュールをロードする簡単な式は何でしょうか? – user3317287

+0

確かに方法はありますが、それは悪い考えです。必要なモジュールをインポートするだけです。私はあなたがあなたが何をしているのかわからないという意味で、あなたが特定のモジュールから必要としているサブモジュールを事前に知っていなければ、より大きな問題があると言います。 – gg349

+0

[これは(http://stackoverflow.com/questions/1707709/list-all-the-modules-that-are-part-of-a-python-package)質問にもかかわらず – gg349