"查看实例对象的docstring以获取更多信息"是什么意思

yat*_*nla 1 docstring instance scipy

我觉得这是一个愚蠢的问题,但当我在一个IPython笔记本中,我确实帮助了一些numpy/scipy函数,比如说stat.norm.rvs,它经常说,关于*args和**kargs,"有关更多信息,请参阅实例对象的docstring".如果没有帮助(stat.norm.rvs),我如何看到这个docstring?

unu*_*tbu 5

不要觉得愚蠢; 有时很难找到您正在寻找的信息,尤其是在开始时.此外,许多文档字符串scipy.stats是自动生成的,因此它们有点通用,而不是定制的.好消息是,一旦你不知道如何操纵分发,所有其他的基本相同,因为它们共享相同的界面.

让我们通过一个例子来解决.由于您使用的是IPython(太棒了!),我们也可以在对象后面使用问号,例如obj?,找出有关该对象的更多信息.这显示了docstring,help(obj)以及其他有用的信息,例如它的类型,定义它的位置,以及(对于callables)它的调用签名.

它有助于了解事物的组织方式.scipy.stats是一个模块:

In [386]: from scipy import stats
Run Code Online (Sandbox Code Playgroud)

模块docstring列出了多种分布.

In [394]: stats?
...
Continuous distributions
========================
   ...
   alpha             -- Alpha
   anglit            -- Anglit
   arcsine           -- Arcsine
   beta              -- Beta
   betaprime         -- Beta Prime
   ...
   norm              -- Normal (Gaussian)
Run Code Online (Sandbox Code Playgroud)

有两个主要类 - stats.rv_continuousstats.rv_discrete.statsdocstring中列出的每个分发都是这两个类之一的实例.stats.norm例如,是其实例 stats.norm_gen是以下的子类stats.rv_continuous:

In [14]: type(stats.norm).mro()
Out[14]: 
[scipy.stats._continuous_distns.norm_gen,
 scipy.stats._distn_infrastructure.rv_continuous,
 scipy.stats._distn_infrastructure.rv_generic,
 object]
Run Code Online (Sandbox Code Playgroud)

请注意,这stats.norms.rvs是一个实例方法:

In [387]: stats.norm.rvs?
Type:        instancemethod
String form: <bound method norm_gen.rvs of <scipy.stats._continuous_distns.norm_gen object at 0x7f1479ba2690>>
Run Code Online (Sandbox Code Playgroud)

所以当它后来说

分布的形状参数( 有关更多信息,请参阅实例对象的docstring ).

它是说文档字符串中有更多信息stats.norm:

In [401]: stats.norm?
Docstring:
A normal continuous random variable.

The location (loc) keyword specifies the mean.
The scale (scale) keyword specifies the standard deviation.
...
Methods
-------
``rvs(loc=0, scale=1, size=1, random_state=None)``
    Random variates.
Run Code Online (Sandbox Code Playgroud)

从这个描述中你可以看到,stats.norm.rvs(loc=10, scale=2, size=5)将返回5个随机变量,平均值为10,标准差为2:

In [402]: stats.norm.rvs(loc=10, scale=2, size=5)
Out[402]: array([  9.82454792,   8.52106712,   7.33889233,   8.73638555,  10.90927226])
Run Code Online (Sandbox Code Playgroud)

或者,stats.norm也可以调用 - 您可以传递locscale"形状"参数以将这些参数"冻结"到分布中.你得到的东西被称为"冻结分布".例如,您可以使用平均值10和标准偏差2创建正态分布:

In [403]: norm = stats.norm(10, 2)
Run Code Online (Sandbox Code Playgroud)

现在调用冻结分布的rvs方法来获得5个随机变量:

In [404]: norm.rvs(5)
Out[404]: array([  7.21018883,  12.98978919,  10.99418761,  11.2050962 ,   8.27780614])
Run Code Online (Sandbox Code Playgroud)