una tamaño que organizar ordenar multiplicacion matriz matrices crear como arreglo array python numpy simulation

tamaño - que es un array en python



Numpy matriz de objetos (3)

La pieza que falta para ti es que Python trata todo como una referencia. (Hay algunos objetos, cadenas, números y tuplas "inmutables" que se tratan más como valores.) Cuando lo hace

lattice[:,:] = site(3)

estás diciendo "Python: crea un nuevo site objeto y dile a cada elemento del lattice que señale ese objeto". Para ver que este es realmente el caso, imprima la matriz para ver que las direcciones de memoria de los objetos son todas iguales:

array([[<__main__.Site object at 0x1029d5610>, <__main__.Site object at 0x1029d5610>, <__main__.Site object at 0x1029d5610>], [<__main__.Site object at 0x1029d5610>, <__main__.Site object at 0x1029d5610>, <__main__.Site object at 0x1029d5610>], [<__main__.Site object at 0x1029d5610>, <__main__.Site object at 0x1029d5610>, <__main__.Site object at 0x1029d5610>]], dtype=object)

La forma de bucle es una forma correcta de hacerlo. Con matrices numpy, esa puede ser tu mejor opción; con las listas de Python, también podría usar una lista de comprensión:

lattice = [ [Site(i + j) for i in range(3)] for j in range(3) ]

Puede utilizar una lista de comprensión con la construcción numpy.array :

lattice = np.array( [ [Site(i + j) for i in range(3)] for j in range(3) ], dtype=object)

Ahora cuando imprimes lattice , es

array([[<__main__.Site object at 0x1029d53d0>, <__main__.Site object at 0x1029d50d0>, <__main__.Site object at 0x1029d5390>], [<__main__.Site object at 0x1029d5750>, <__main__.Site object at 0x1029d57d0>, <__main__.Site object at 0x1029d5990>], [<__main__.Site object at 0x1029d59d0>, <__main__.Site object at 0x1029d5a10>, <__main__.Site object at 0x1029d5a50>]], dtype=object)

para que pueda ver que cada objeto allí es único.

También debe tener en cuenta que los métodos "setter" y "getter" (por ejemplo, set_a ) no son Pythonic. Es mejor establecer y obtener atributos directamente, y luego usar el decorador @property si REALMENTE necesita evitar el acceso de escritura a un atributo.

También tenga en cuenta que es estándar que las clases de Python se escriban usando CamelCase, no en minúsculas.

Estoy intentando implementar una simulación para un modelo de celosía (lattice boltzmann) en Python. Cada sitio de la red tiene una serie de propiedades e interactúa con 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, esto podría no ser una buena idea, así que siéntete libre de comentar sobre mi enfoque).

Aquí hay 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 lidiar con una red 2D / 3D (cuadrícula) de dichos sitios, así que intenté hacer lo siguiente (aquí hay una cuadrícula 2D 3x3 como ejemplo, pero en 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 a 5. Este comportamiento no es deseado. Para evitar el problema, puedo recorrer cada punto de la cuadrícula y asignar los elementos elemento por elemento, como

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

Pero, ¿hay una forma mejor (que no implique los bucles) de asignar objetos a una matriz multidimensional?

Gracias


No conozco mejor, pero como alternativa a un conjunto explícito de bucles, podrías escribir

lattice = np.empty( (3,3), dtype=object) lattice.flat = [site(3) for _ in lattice.flat]

Lo que debería funcionar cualquiera que sea la forma de la celosía.


Puedes vectorize la función __init__ la clase:

import numpy as np class Site: def __init__(self, a): self.a = a def set_a(self, new_a): self.a = new_a vSite = np.vectorize(Site) init_arry = np.arange(9).reshape((3,3)) lattice = np.empty((3,3), dtype=object) lattice[:,:] = vSite(init_arry)

Esto puede parecer más limpio pero no tiene ninguna ventaja de rendimiento sobre su solución de bucle. Las respuestas de la lista de comprensión crean una lista de python intermedia que causaría un impacto en el rendimiento.