生成仅包含值为0或1的随机稀疏矩阵

8
我正在尝试使用SciPy生成一个随机csr_matrix,但是我希望它只包含值为0或1的数据。
到目前为止,我尝试使用以下方法: ```rand(1000, 10, density=0.2, format='csr', random_state=np.random.randint(0, 2))```
这使我得到了我想要的正确结构和密度,但是填充它的值是介于0和1之间的浮点数。
有没有一种方法可以仅生成由0或1组成的浮点数结构?
3个回答

12

您可以将随机矩阵中的非零值替换为1:

from scipy.sparse import rand

x = rand(1000, 10, density=0.2, format='csr')
x.data[:] = 1

print(np.unique(x.todense().flat))
# [ 0.  1.]

我认为random_state=关键字参数并不像你想象的那样起作用-它只是允许你指定随机数生成器的种子,或者显式地传递一个np.random.RandomState实例以用作随机数生成器。


有没有什么原因,我不能做 x[0].data[:] = 0.5 来仅更改矩阵中第一行的值?如果我做 temp = x[0] 然后 temp.data[:] = 0.5,这可以工作,但我需要更新实际矩阵中的行。 - myles
1
原因是对 CSR 矩阵进行索引始终会生成副本。您可以找出第一行中有多少个非零元素,然后将相应数量的数据值设置为0.5,例如 x.data[:x[0].nnz] = 0.5 - ali_m
1
...或者对于任意行号,您可以使用.indptr属性找到相应的索引进入.data,例如x.data[x.indptr[i]:x.indptr[i+1]] = 0.5来设置第i行的值。 - ali_m

4
如何?
import scipy.sparse as ss
data = ss.random(1000, 10, density=.2, format='csr',
                 data_rvs=np.ones,   # fill with ones
                 dtype='f'           # use float32 first
                 ).astype('int8')    # then convert to int8

ss.random只支持浮点类型,其中float32是最小的浮点类型,而int8是可用的最小整数类型。

更多信息请参见https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.random.html


1
np.random.randint(0,2,1000)

将生成1000个介于0和1之间的随机变量。然后,您可以自行选择要使用哪种容器来存储矩阵。

my_v = np.random.randint(0,5,1000)
my_v[my_v>1]=1

1
如果维度很大,那么这是一种非常浪费内存的初始化稀疏矩阵的方式。 - ali_m
我可以用这种方式选择密度吗? - myles
它具有均匀分布。您是否有特定的密度函数? - moldovean
我想要一个20%非零值的密度,这可能吗?虽然另一个答案能够满足我的需求,但我以后可能仍需要使用这种方法。 - myles
1
那么这是一个数学技巧 :) ... 创建一个 np.random.randint(0,5,1000) 然后用1替换所有>0的值 ;) - moldovean
抱歉,我想说的是80%,但我理解这个方法了。谢谢你的帮助 :) - myles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接