Scipy处理子模块的方式与Numpy不同,例如
import scipy as sp
import numpy as np
A = np.eye(4)
np.linalg.det(A)
sp.linalg.det(A)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'scipy' has no attribute 'linalg'
由于Numpy的不对称性,这有点烦人,但这正是文档描述的行为。
from scipy import linalg
import numpy as np
A = np.eye(4)
np.linalg.det(A)
linalg.det(A) # using Scipy
这样就可以了。
奇怪的是
import scipy as sp
import numpy as np
from scipy.linalg import expm # extra line inserted into first example
A = np.eye(4)
np.linalg.det(A)
sp.linalg.det(A)
那么Numpy样式的代码就可以很好地工作。额外的行导致linalg
被添加到名称空间sp
中,这是额外导入的副作用。
我得到了我想要的编程模式,但是第三行不容易在示例代码中解释。
问:为什么Scipy要这样做?有没有更直接的方法让Scipy表现得更麻木?
1条答案
按热度按时间im9ewurl1#
事实上,你几乎从来不需要或想要
import scipy as sp
或类似的东西。顶层scipy命名空间中几乎什么都没有。所有有用的东西都在子包中(一个例外是LowLevelCallable,它在顶层命名空间中 is)。这样,用户最好要么从子包导入,
from scipy.signal import detrend
,要么自己导入子包(from scipy import signal; signal.detrend(...)
)。至于与numpy的差距,numpy则完全相反:* 很多 * 有用的东西都在顶级命名空间中,所以你可以从那里导入它。除非你使用
np.linalg
,np.random
,np.fft
或np.testing
,这些都是面向公共的可用子模块。