【问题标题】:Generate random sparse matrix filled with only values 0 or 1生成仅填充值 0 或 1 的随机稀疏矩阵
【发布时间】:2015-06-27 00:40:32
【问题描述】:

我正在尝试使用 SciPy 生成一个随机 csr_matrix,但我需要它只填充值 0 或 1。

到目前为止,我正在尝试使用:

rand(1000, 10, density=0.2, format='csr', random_state=np.random.randint(0, 2))

我得到了我想要的正确结构和密度,但填充它的值是介于 0 和 1 之间的浮点数。

有没有办法只用 0 或 1 的浮点数生成这个结构?

【问题讨论】:

    标签: python numpy random scipy sparse-matrix


    【解决方案1】:

    您可以简单地将随机矩阵中的非零值替换为 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= kwarg 不会像您认为的那样做 - 它只是允许您指定随机数生成器的种子,或者显式传递 np.random.RandomState 实例作为 RNG .

    【讨论】:

    • 有什么原因我不能 x[0].data[:] = 0.5 仅更改矩阵第一行中的值吗?如果我先temp = x[0] 然后temp.data[:] = 0.5,这可行,但我需要更新实际矩阵中的行。
    • 原因是索引到 CSR 矩阵总是会生成一个副本。您可以找出第一行中有多少个非零元素,然后将相应的数据值数量设置为 0.5,例如x.data[:x[0].nnz] = 0.5.
    • ...或者对于任意行号,您可以使用.indptr 属性来查找.data 的相应索引,例如x.data[x.indptr[i]:x.indptr[i+1]] = 0.5 设置ith 行的值
    【解决方案2】:

    怎么样

    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

    【讨论】:

      【解决方案3】:
      np.random.randint(0,2,1000)
      

      将生成 1000 个介于 0 和 1 之间的随机变量。然后,由您决定要为矩阵使用哪种容器

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

      【讨论】:

      • 如果维度很大,那么初始化稀疏矩阵的内存效率非常低
      • 我可以这样选择密度吗?
      • 它具有均匀分布。您是否考虑过特定​​的密度函数?
      • 嗯,我想要一个 20% 非零值的密度。这可能吗?虽然其他答案符合我的要求,但我以后可能仍需要使用此方法。
      • 那么这是一个数学技巧 :) ... 制作一个 np.random.randint(0,5,1000) 然后将 >0 的所有内容替换为 1 ;)
      猜你喜欢
      • 2019-10-14
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多