scipy 奇怪的进口行为

c2e8gylq  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(123)

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表现得更麻木?

im9ewurl

im9ewurl1#

事实上,你几乎从来不需要或想要import scipy as sp或类似的东西。
顶层scipy命名空间中几乎什么都没有。所有有用的东西都在子包中(一个例外是LowLevelCallable,它在顶层命名空间中 is)。这样,用户最好要么从子包导入,from scipy.signal import detrend,要么自己导入子包(from scipy import signal; signal.detrend(...))。
至于与numpy的差距,numpy则完全相反:* 很多 * 有用的东西都在顶级命名空间中,所以你可以从那里导入它。除非你使用np.linalgnp.randomnp.fftnp.testing,这些都是面向公共的可用子模块。

相关问题