gran variedad de objetos

Estoy tratando de implementar una simulación para un modelo de red (boltzmann de red) en Python. Cada sitio de la red tiene una serie de propiedades e interactúa con los sitios vecinos de acuerdo con ciertas reglas. Pensé que podría ser inteligente hacer una clase con todas las propiedades y hacer una cuadrícula de instancias de esa clase. (Como no tengo experiencia con Python, esta podría no ser una buena idea, así que siéntase libre de comentar sobre mi enfoque).

Aquí hay un ejemplo de lo que estoy haciendo.

class site:
    def __init__(self,a,...):
        self.a = a
        .... other properties ...
    def set_a(self, new_a):
        self.a = new_a

Ahora quiero tratar con una red (cuadrícula) 2D / 3D de dichos sitios, así que intenté hacer lo siguiente (aquí hay una cuadrícula 2D 3x3 como ejemplo, pero en la simulación necesitaría el orden de> 1000x1000X1000)

lattice = np.empty( (3,3), dtype=object)
lattice[:,:] = site(3)

Ahora, el problema es que cada punto de la red se refiere a la misma instancia, por ejemplo

lattice[0,0].set_a(5)

también establecerá el valor de la red [0,2] .a en 5. Este comportamiento no es deseado. Para evitar el problema, puedo recorrer cada punto de la cuadrícula y asignar los objetos elemento por elemento, como

for i in range(3):
    for j in range(3):
        lattice[i,j] = site(a)

Pero, ¿hay una mejor manera (sin involucrar los bucles) para asignar objetos a una matriz multidimensional?

Gracias

Respuestas a la pregunta(3)

Su respuesta a la pregunta