Estoy tratando de implementar una simulación para un modelo de celosía (celtice boltzmann) en Python. Cada sitio del enrejado tiene varias 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 grilla de instancias de esa clase. (Como estoy sin experiencia con Python, esto podría no ser una buena idea en absoluto, así que siéntase libre de comentar en mi enfoque.)numpy array of objects
Aquí está un ejemplo de juguete 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 retícula 2D/3D (cuadrícula) de dichos sitios, así que traté de hacer lo siguiente (aquí hay una grilla 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 reticular se refiere a la misma instancia, por ejemplo
lattice[0,0].set_a(5)
también establecerá el valor de reticulado [0,2] .a en 5. Este comportamiento no es deseado. Para evitar el problema que puede bucle sobre cada punto de la rejilla y asignar el elemento a elemento objetos, como
for i in range(3):
for j in range(3):
lattice[i,j] = site(a)
Pero, ¿existe una mejor manera (que no implican los bucles) para asignar objetos a una matriz multidimensional?
Gracias
Si se trata de una matriz> 1000x1000X1000, _don't_ no use una matriz de objetos !! Utilizará grandes cantidades de memoria en comparación con el uso de una matriz numpy "normal". Las matrices de objetos no son lo que quieres aquí ... –
por simulación Supongo que te refieres a la simulación de fluidos? Si es así, te recomendaré que reconsideres tu enfoque. Quizás los elementos de tus matrices deberían ser numéricos, para que puedas aprovechar todo el poder del álgebra lineal ;-). ¡Los procesos de propagación de partículas y colisión deben realizarse globalmente! Ningún enrejado de objeto local es capaz de manejar eso en cualquier tiempo de cálculo razonable. Sólo duros, no sé realmente lo que pretendes ;-). Gracias – eat
@eat: estoy haciendo simulación de fluidos. Quería codificar una grilla genérica de sitios, donde todas las propiedades locales se recopilaban en una clase (la colisión es local en mi libro, no la propagación), pero supongo que tienes razón después de todo. Al menos bpowah me enseñó a vectorizar la función __init__ :) – jonalm