scipy.sparse.

random#

scipy.sparse.random(m, n, density=0.01, format='coo', dtype=None, rng=None, data_rvs=None)[source]#

生成具有给定形状和密度、值随机分布的稀疏矩阵。

警告

此函数返回一个稀疏矩阵,而非稀疏数组。建议您使用 random_array 以利用稀疏数组功能。

参数:
m, nint

矩阵的形状

density实数,可选

生成矩阵的密度:密度为一表示完整矩阵,密度为零表示不含任何非零项的矩阵。

format字符串,可选

稀疏矩阵格式。

dtypedtype,可选

返回矩阵值的类型。

rng{None, int, numpy.random.Generator},可选

如果 `rng` 以关键字形式传递,则除了 numpy.random.Generator 之外的类型将被传递给 numpy.random.default_rng 以实例化一个 Generator。如果 rng 已是 Generator 实例,则使用所提供的实例。指定 rng 以实现可重复的函数行为。

如果此参数按位置传递,或者 random_state 按关键字传递,则适用参数 random_state 的旧版行为

  • 如果 random_state 为 None(或 numpy.random),则使用 numpy.random.RandomState 单例。

  • 如果 random_state 是一个整数,则使用一个新的 RandomState 实例,并以 random_state 为种子。

  • 如果 random_state 已是 GeneratorRandomState 实例,则使用该实例。

版本 1.15.0 中有所更改:作为从使用 numpy.random.RandomStatenumpy.random.GeneratorSPEC-007 过渡的一部分,此关键字已从 random_state 更改为 rng。在过渡期内,两个关键字将继续有效,但一次只能指定一个。过渡期结束后,使用 random_state 关键字的函数调用将发出警告。random_staterng 的行为如上所述,但在新代码中应只使用 rng 关键字。

此随机状态将用于采样稀疏结构,但不一定用于采样矩阵结构非零项的值。

data_rvs可调用对象,可选

采样所需数量的随机值。此函数应接受一个参数,指定其将返回的 ndarray 的长度。稀疏随机矩阵的结构非零项将取自此函数采样的数组。默认情况下,将使用与采样稀疏结构相同的随机状态来采样均匀分布的 [0, 1) 随机值。

返回值:
res稀疏矩阵

另请参阅

random_array

构造稀疏数组而非稀疏矩阵

示例

传入 np.random.Generator 实例以获得更好性能

>>> import scipy as sp
>>> import numpy as np
>>> rng = np.random.default_rng()
>>> S = sp.sparse.random(3, 4, density=0.25, rng=rng)

提供值的采样器

>>> rvs = sp.stats.poisson(25, loc=10).rvs
>>> S = sp.sparse.random(3, 4, density=0.25, rng=rng, data_rvs=rvs)
>>> S.toarray()
array([[ 36.,   0.,  33.,   0.],   # random
       [  0.,   0.,   0.,   0.],
       [  0.,   0.,  36.,   0.]])

构建自定义分布。此示例使用 np.random 构建一个平方正态分布

>>> def np_normal_squared(size=None, rng=rng):
...     return rng.standard_normal(size) ** 2
>>> S = sp.sparse.random(3, 4, density=0.25, rng=rng,
...                      data_rvs=np_normal_squared)

或者我们可以从 sp.stats 风格的 rvs 函数构建它

>>> def sp_stats_normal_squared(size=None, rng=rng):
...     std_normal = sp.stats.distributions.norm_gen().rvs
...     return std_normal(size=size, random_state=rng) ** 2
>>> S = sp.sparse.random(3, 4, density=0.25, rng=rng,
...                      data_rvs=sp_stats_normal_squared)

或者我们可以子类化 sp.stats rv_continuous 或 rv_discrete

>>> class NormalSquared(sp.stats.rv_continuous):
...     def _rvs(self,  size=None, random_state=rng):
...         return rng.standard_normal(size) ** 2
>>> X = NormalSquared()
>>> Y = X()  # get a frozen version of the distribution
>>> S = sp.sparse.random(3, 4, density=0.25, rng=rng, data_rvs=Y.rvs)