Я пытаюсь реализовать симуляцию для решетчатой модели (решетка болтцмана) в Python. Каждый сайт решетки обладает рядом свойств и взаимодействует с соседними сайтами в соответствии с определенными правилами. Я подумал, что было бы разумно сделать класс со всеми свойствами и создать сетку экземпляров этого класса. (Как я неопытных с Python, это не может быть хорошей идеей, на всех, так что не стесняйтесь комментировать мой подход.)numpy array of objects
Вот это игрушка пример того, что я делаю
class site:
def __init__(self,a,...):
self.a = a
.... other properties ...
def set_a(self, new_a):
self.a = new_a
Теперь я хочу иметь дело с 2D/3D решеткой (сеткой) таких сайтов, поэтому я попытался сделать следующее (здесь в качестве примера используется сетка 2D 3x3, но в моделировании мне понадобится порядок> 1000x1000X1000)
lattice = np.empty((3,3), dtype=object)
lattice[:,:] = site(3)
Проблема в том, что каждая точка решетки относится к одному экземпляру, например
lattice[0,0].set_a(5)
также установит значение решетки [0,2] .a - 5. Это поведение нежелательно. Чтобы избежать этой проблемы я могу цикл по каждой точке сетки и присвоить элемент объектов элемента, как
for i in range(3):
for j in range(3):
lattice[i,j] = site(a)
Но есть лучший способ (не включая петлю), чтобы присвоить объекты многомерного массива?
Благодаря
Если вы имеете дело с массивом> 1000x1000X1000, _don't_ используйте массив объектов !! Он будет использовать вопиющие объемы памяти по сравнению с использованием «нормального» массива numpy. Объектные массивы здесь не то, что вам нужно ... –
от моделирования Я думаю, вы подразумеваете моделирование жидкости? Если да, то я рекомендую вам пересмотреть свой подход. Возможно, элементы ваших массивов должны быть численными, чтобы вы могли использовать всю силу линейной алгебры ;-). Процессы распространения частиц и столкновения должны выполняться во всем мире! Никакая локальная решетка объектов не может справиться с этим в любое разумное время вычисления. Просто ударные, не знаю, на что вы стремитесь ;-). Спасибо – eat
@eat: Я делаю жидкостное моделирование. Я хотел закодировать общую сетку сайтов, где все локальные свойства были собраны в классе (столкновение является локальным в моей книге, а не распространением tho), но, я думаю, вы в конце концов. По крайней мере, bpowah научил меня векторизовать функцию __init__ :) – jonalm