Generating Symmetric Matrices in Numpy
Question: I am trying to generate symmetric matrices in numpy. Specifically, these
matrices are to have random places entries, and in each entry the contents can
be random. Along the main diagonal we are not concerned with what enties are
in there, so I have randomized those as well.

The approach I have taken is to first generate a nxn all zero matrix and
simply loop over the indices of the matrices. However, given considering
looping is relatively expensive in python, I'm wondering if I can acheive the
same thing without using python's for loops.

Is there some things built into numpy that allow me to acheive my goal more
efficiently?

Here is my current code:

    
    
    import numpy as np
    import random
    
    def empty(x, y):
        return x*0
    
    b = np.fromfunction(empty, (n, n), dtype = int)
    
    for i in range(0, n):
        for j in range(0, n):
            if i == j:
                b[i][j] = random.randrange(-2000, 2000)
            else:
                switch = random.random()
                random.seed()
                if switch > random.random():
                    a = random.randrange(-2000, 2000)
                    b[i][j] = a
                    b[j][i] = a
                else:
                    b[i][j] = 0
                    b[j][i] = 0
    


Answer: You could just do something like:

    
    
    import numpy as np
    
    N = 100
    b = np.random.random_integers(-2000,2000,size=(N,N))
    b_symm = (b + b.T)/2
    

Where you can choose from whatever distribution you want in the `np.random` or
equivalent scipy module.

**Update:** If you are trying to build graph-like structures, definitely check
out the networkx package:

<http://networkx.lanl.gov>

which has a number of built-in routines to build graphs:

<http://networkx.lanl.gov/reference/generators.html>

Also if you want to add some number of randomly placed zeros, you can always
generate a random set of indices and replace the values with zero.

