Solución:
Podrías hacer algo como:
import numpy as np
N = 100
b = np.random.random_integers(-2000,2000,size=(N,N))
b_symm = (b + b.T)/2
Donde puede elegir entre la distribución que desee en el np.random
o módulo scipy equivalente.
Actualizar: Si está intentando construir estructuras de tipo gráfico, definitivamente consulte el paquete networkx:
http://networkx.lanl.gov
que tiene una serie de rutinas integradas para crear gráficos:
http://networkx.lanl.gov/reference/generators.html
Además, si desea agregar algún número de ceros colocados aleatoriamente, siempre puede generar un conjunto aleatorio de índices y reemplazar los valores con cero.
Será mejor que haga:
a = np.random.rand(N, N)
m = np.tril(a) + np.tril(a, -1).T
porque en este caso todos los elementos de una matriz son de misma distribución (uniforme en este caso).
Existe una propiedad matemática en las matrices que permite que dicha estructura se cree fácilmente: AT * A donde A es un vector fila y A es la transposición (un vector de columna). Esto siempre devuelve una matriz simétrica definida positiva cuadrada que siempre es invertible, por lo que no tiene preocupaciones con pivotes nulos;)
# any matrix algebra will do it, numpy is simpler
import numpy.matlib as mt
# create a row vector of given size
size = 3
A = mt.rand(1,size)
# create a symmetric matrix size * size
symmA = A.T * A