[SciPy-user] Random sparse matrices

Nils Wagner nwagner at iam.uni-stuttgart.de
Fri Apr 25 16:14:53 EDT 2008


On Fri, 25 Apr 2008 22:04:00 +0200
  "Anne Archibald" <peridot.faceted at gmail.com> wrote:
> On 25/04/2008, Nathan Bell <wnbell at gmail.com> wrote:
>> On Fri, Apr 25, 2008 at 9:17 AM, Mico Filós 
>><elmico.filos at gmail.com> wrote:
>>  > Dear all,
>>  >
>>  >  here is my first attempt. I basically use Nathan's 
>>suggested
>>  >  functions, and _rand_sparse incorporates the 
>>algorithm proposed by
>>  >  David to avoid ending up with fewer nonzero elements 
>>than expected. It
>>  >  is the first time I propose an update
>>  >  for scipy code, so be lenient with me :)
>>
>>
>> Thanks for your contribution Mico.  Unfortunately, the 
>>line
>>
>>    rand_seq = permutation(m*n)[:nnz]
>>
>> is a *dense* MxN operation, so we cannot use this 
>>approach.
>>
>>  MATLAB's sprand() and sprandn() have the same artifact 
>>as the code I
>>  presented, so I don't know whether it's worth trying to 
>>avoid the
>>  duplicate entries.
>>
>>  If you can figure out an economial way to produce 
>>exactly nnz elements
>>  in the result, then we would probably use it.  I wasn't 
>>able to come
>>  up with anything better than the MATLAB approach.
> 
> Here's an approach that works. Not ideal, but still only 
>O(nnz): pick
> nnz distinct integers. Throw out any repeats and pick 
>replacements.
> Repeat until you have no repeats. Requires an average of 
>just a few
> iterations unless nnz>(m*n)/2 (say), in which case you 
>can safely just
> use permutation().
> 
> Anne

Hi Anne,

I run your script several times. Sometimes I get
>>> sprandn(5,5,3).todense()
matrix([[ 0.        ,  0.        ,  0.        ,  0. 
       ,  0.        ],
         [ 0.        ,  0.36548958,  0.        ,  0. 
       ,  0.        ],
         [ 1.51125878,  0.        ,  0.        ,  0. 
       , -0.20285678],
         [ 0.        ,  0.        ,  0.        ,  0. 
       ,  0.        ],
         [ 0.        ,  0.        ,  0.        ,  0. 
       ,  0.        ]])
>>> sprandn(5,5,3).todense()
Traceback (most recent call last):
   File "<stdin>", line 1, in ?
   File "sprand.py", line 23, in sprandn
     return 
scipy.sparse.coo_matrix((np.random.randn(nnz),ij),(m,n))
   File 
"/usr/lib/python2.4/site-packages/scipy/sparse/coo.py", 
line 180, in __init__
     self._check()
   File 
"/usr/lib/python2.4/site-packages/scipy/sparse/coo.py", 
line 213, in _check
     raise ValueError, "row index exceedes matrix 
dimensions"
ValueError: row index exceedes matrix dimensions

Cheers,
           Nils



More information about the SciPy-User mailing list