scipy.sparse.

random_array#

scipy.sparse.random_array(shape, *, density=0.01, format='coo', dtype=None, rng=None, data_sampler=None)[源代码]#

返回一个在 [0, 1) 范围内均匀分布的稀疏随机数数组。

返回一个具有给定形状和密度的稀疏数组,其值在 [0, 1) 范围内均匀随机生成。

参数:
shape整数或整数元组

数组的形状

density实数,可选(默认值:0.01)

生成矩阵的密度:密度为 1 表示一个完整矩阵,密度为 0 表示一个没有非零项的矩阵。

format字符串,可选(默认值:‘coo’)

稀疏矩阵格式。

dtypedtype,可选(默认值:np.float64)

返回矩阵值的类型。

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 中更改: 作为从使用 SPEC-007 过渡到 numpy.random.GeneratorSPEC-007 转换的一部分,此关键字从 random_state 更改为 rng。在过渡期间,这两个关键字都将继续有效,但一次只能指定一个。过渡期结束后,使用 random_state 关键字的函数调用将发出警告。random_staterng 的行为如上所述,但新代码中应只使用 rng 关键字。

此随机状态将用于采样 indices(稀疏结构),默认也用于数据值(参见 data_sampler)。

data_sampler可调用对象,可选(默认值取决于 dtype)

随机数据值的采样器,带有关键字参数 size。此函数应接受一个关键字参数 size,用于指定其返回的 ndarray 的长度。在选择非零值的位置之后,它用于生成矩阵中的非零值。默认情况下,使用均匀分布的 [0, 1) 随机值,除非 dtype 是整数(默认从该 dtype 中均匀采样整数)或复数(默认在复平面单位正方形内均匀采样)。对于这些情况,将使用 rng,例如 rng.uniform(size=size)

返回:
res稀疏数组

示例

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

>>> import numpy as np
>>> import scipy as sp
>>> rng = np.random.default_rng()

默认从 [0, 1) 中均匀采样

>>> S = sp.sparse.random_array((3, 4), density=0.25, rng=rng)

为值提供一个采样器

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

为无符号整数值提供一个采样器

>>> def random_uint32_to_100(size=None):
...     return rng.integers(100, size=size, dtype=np.uint32)
>>> S = sp.sparse.random_array((3, 4), density=0.25, rng=rng,
...                            data_sampler=random_uint32_to_100)

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

>>> def np_normal_squared(size=None, rng=rng):
...     return rng.standard_normal(size) ** 2
>>> S = sp.sparse.random_array((3, 4), density=0.25, rng=rng,
...                            data_sampler=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_array((3, 4), density=0.25, rng=rng,
...                            data_sampler=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().rvs
>>> S = sp.sparse.random_array((3, 4), density=0.25,
...                            rng=rng, data_sampler=Y)