2016-04-23 8 views
0

Я пытаюсь создать вектор состояния, представляющий положения и скорости ряда частиц в заданное время, для моделирования. Я создал отдельные векторы x, y, vx, vy, которые дают значение этой переменной для каждой частицы. Есть ли хороший способ автоматического комбинирования их в один массив, который содержит всю информацию для частицы, за которой следует вся информация для частицы два и т. Д. И т. Д.)? СпасибоСоздайте массив python из первого элемента массива 1, первого элемента массива 2, второго элемента массива 1, второго элемента массива 2 и т. Д.

ответ

1

Вы имеете в виду это?

x = [0, 1, 2] 
y = [3, 4, 5] 
vx = [6, 7, 8] 
vy = [9, 10, 11] 

c = zip(x, y, vx, vy) 
print(c) # -> [(0, 3, 6, 9), (1, 4, 7, 10), (2, 5, 8, 11)] 

, если вы используете Python 3, вам нужно будет использовать c = list(zip(x, y, vx, vy)).

Если вы не хотите, чтобы значения для каждой частицы группируются в кортеж, как, что по какой-то причине, то результат может быть уплощен:

c = [item for group in zip(x, y, vx, vy) for item in group] 
print(c) # -> [0, 3, 6, 9, 1, 4, 7, 10, 2, 5, 8, 11] 

Однако, я бы рекомендовал просто «называть» кортежи вместо:

from collections import namedtuple 

Particle = namedtuple('Particle', 'x, y, vx, vy') 
c = [Particle._make(group) for group in zip(x, y, vx, vy)] 
print(c) 

Выход:

[Particle(x=0, y=3, vx=6, vy=9), 
Particle(x=1, y=4, vx=7, vy=10), 
Particle(x=2, y=5, vx=8, vy=11)] 

Таким образом, вы можете ссылаться на поля по имени - то есть c[1].x - что может сделать последующий код и вычисления намного более удобочитаемыми.

+0

Да, это то, к чему я стремился. Огромное спасибо. Будет ли тот факт, что новый список сгруппирован (как указывают скобки), влияет на любые будущие расчеты, выполненные на нем? –

+0

Это создает список кортежей, поэтому информация для первой частицы находится в 'c [0]' где 'c [0] [0]' - значение 'x' первой частицы,' c [0] [ 1] 'является его' y'value и т. Д. Информация для второй частицы находится в 'c [1]'. Это не повлияет на будущие вычисления при условии правильного доступа к значениям. Если это слишком громоздко, его можно было бы улучшить, чтобы создать разные под-объекты. Отвечает ли мой ответ на вашу проблему? (Пожалуйста, см. [_Что делать, если кто-то отвечает на мой вопрос?] (Http://stackoverflow.com/help/someone-answers)) – martineau

+0

Думаю, что да. Есть ли способ сделать то же самое, не будучи списком кортежей? то есть только отдельные числа в массиве –

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