Похоже, что функция, которую вы хотите, была добавлена около двух месяцев назад и будет доступна в scipy 0.16: L671" rel="noreferrer">https://github.com/scipy/scipy/blob/77af8f44bef43a67cb14c247bc230282022ed0c2/scipy/sparse/construct.py#L671
Вы сможете вызвать sparse.random(10, 10, 0.1, random_state=RandomState(1), data_fvs=func)
, где func
"должен принимать один аргумент, указывающий длину возвращаемого массива ndarray. Структурно ненулевые элементы разреженной случайной матрицы будут взяты из массива, отобранного этой функцией". Таким образом, вы сможете предоставить произвольный дистрибутив для выборки.
На данный момент вы можете, по крайней мере, растянуть равномерное распределение до [0,N], умножив p на скаляр N:
>>> print 2*p
(0, 0) 0.838389028807
(9, 0) 1.37043900079
(4, 1) 0.408904499463
(8, 1) 1.75623487278
(0, 3) 0.0547751863959
(4, 3) 1.34093502036
(9, 3) 0.834609604734
(1, 4) 1.11737965689
(3, 5) 0.28077387719
(2, 7) 0.39620297817
Вы не можете добавлять скаляры, но в качестве хака вы можете создать разреженную матрицу со всеми единицами в ненулевых элементах с p.ceil()
, поскольку все элементы p были сгенерированы в пределах [0,1]. Затем, чтобы преобразовать равномерное распределение в [-1,1], вы можете сделать
print 2*p - p.ceil()
(0, 0) -0.161610971193
(0, 3) -0.945224813604
(1, 4) 0.117379656892
(2, 7) -0.60379702183
(3, 5) -0.71922612281
(4, 1) -0.591095500537
(4, 3) 0.340935020357
(8, 1) 0.756234872782
(9, 0) 0.370439000794
(9, 3) -0.165390395266
В общем, если вам нужен какой-то интервал [a,b], просто выполните:
p = (b - a)*p + a*p.ceil()
В настоящее время я не вижу лучшего решения, кроме написания собственного конструктора, похожего на sparse.rand
, но мне было бы любопытно узнать, знает ли кто-нибудь хотя бы способ обойти хак ceil()
.
person
Eric Appelt
schedule
02.06.2015