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するのは無駄だからのようです(参考)。