scipyの使いはじめ方

scipyは他の多くのパッケージと違い、scipyに様々な関数やクラスがモジュールとして含まれているのではなくて、scipyの下に様々なサブパッケージが含まれていて、必要なサブパッケージをimportして使います。

numpyでの線形代数の演算は (下の例は固有値、固有ベクトルの計算)、次のようにnumpyをimportすれば行えますが、

$ python
>>> import numpy as np
>>> A = np.array([[1, 2], [3, 4]])
>>> np.linalg.eig(A)
(array([-0.37228132,  5.37228132]), array([[-0.82456484, -0.41597356],
       [ 0.56576746, -0.90937671]]))

scipyでは、線形代数用のサブパッケージlinalgを個別にimportしなくてはいけません。

>>> from scipy import linalg
>>> linalg(A)
(array([-0.37228132+0.j,  5.37228132+0.j]), array([[-0.82456484, -0.41597356],
       [ 0.56576746, -0.90937671]]))

scipyをimportしてやろうとするとどうなるかというと、以下のようにエラーになります。(一度linalgをimportしてからであればエラーにはなりません。)

$ python
>>> import numpy as np
>>> import scipy as sp
>>> A = np.array([[1, 2], [3, 4]])
>>> sp.linalg.eig(A)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'scipy' has no attribute 'linalg'
>>> from scipy import linalg
>>> sp.linalg.eig(A)
(array([-0.37228132+0.j,  5.37228132+0.j]), array([[-0.82456484, -0.41597356],
       [ 0.56576746, -0.90937671]]))

このような設計になっているのは、scipyが多くの機能を含んでいて、毎回すべてをimportするのは無駄だからのようです(参考)。