0

Что-то из последующего вопроса до my last one о написании эффективных программ python. Я играю с написанием своих собственных физических симуляций и хочу уйти от использования миллиарда классов и методов.Запись результатов расчета обратно в его массив?

Поэтому я хочу иметь возможность выполнять вычисления на наборах данных. Это моя последняя попытка:

particles = np.array([ #position, last position, velocity, mass, size 
       [[200,0],[200,200],[5,5],10,15], \ 
       [[210,210],[210,210],[8,2],20,25],\ 
       [[215,215],[195,195],[5,3],5,15], \ 
       [[192,186],[160,160],[10,-4],30,30]]) 

def moveParticles(part, dt): 
    part[0] = part[1] 
    part[1] += np.multiply(part[2],dt) 

Я пытаюсь хранить каждое из свойств каждой частицы в массиве, а затем обновить их на месте. Здесь я пытаюсь умножить вектор скорости на временной шаг, а затем добавить это к вектору положения. Это кажется естественным образом выразить это мне, но это дает мне ошибку:

TypeError: can't multiply sequence by non-int of type 'float' 

Могу ли я записать данные обратно в тот же массив, и как бы я идти об этом?

Я читал об этом и смотрел на вещи, такие как функция векторизации numpy, itertools, map() и т. Д. ... но как я могу поместить результаты обратно в исходный массив?

Или используется промежуточный массив для хранения результатов, прежде чем перезаписывать оригинал, единственный способ пойти?

+1

Как вызывается перемещение частиц? – Sinkingpoint

+0

Пожалуйста, укажите требуемый выход. – root

+1

Поскольку у вас есть списки различной длины в ваших данных, то, что возвращает 'np.array', является dtype' object' и 'particle [:, 0]', 'particle [:, 1]' и 'particle [:, 2] '- это списки Python, а не массивы. Следовательно, ошибка, когда вы пытаетесь размножить список скоростей с помощью 'dt' float. Вы должны попробовать хранить однородные данные в массивах. Мне нравится беззаботность Балинта! – Jaime

ответ

2

Я думаю, вы просто вызвать вашу рутину неправильного пути (возможно, передавая ей массив целиком частиц вместо массива только для одной частицы.

Во всяком случае, на другом возможном решении было бы разделить ваш массив в индивидуальном массивы:

import numpy as np 
pos = np.array([[200,0], [210,210], [215,215], [192,186]], dtype=float) 
lastpos = np.array([[200,2000], [ 210,210], [195, 195], [160,160]], dtype=float) 
velocity = np.array([[ 5,5], [8,2], [5,3], [10,-4]], dtype=float) 
mass = np.array([ 10, 20, 5, 30 ], dtype=float) 
size = np.array([ 15, 25, 15, 30 ], dtype=float) 

def moveParticles(pos, lastpos, velocity, dt): 
    lastpos[:] = pos[:] 
    pos[:] += velocity * dt 

Это сделало бы на месте замену pos и lastpos для того, чтобы переместить частицы, вы должны вызвать функцию:.

moveParticles(pos, lastpos, velocity, 1) 

где я устанавливаю dt = 1. Я также предположил, что вы хотите иметь координаты с плавающей запятой, если нет, вы должны генерировать целые массивы.

+0

Это похоже на очень хорошее решение. Это просто означает, что мне придется удалить один и тот же элемент из нескольких массивов, если я уничтожу частицу, а не просто удалю один элемент. Благодаря! – mooglinux

Смежные вопросы