Вы можете сделать это с пониманием списка.Это быстрее, чем обычный цикл.
Я не знаю, какие объекты хранятся внутри masses
, поэтому для примера рассмотрим в качестве простого списка masses
.
solution = [[0,0,0,0,0,0], [1,2,3,4,5,6], [2,4,6,8,10,12]]
masses = [None] * 3 #I get that its length should be half of the length of the inner lists in solution.
for i in range(len(masses)):
masses[i] = [j[2*i:2*(i+1)] for j in solution]
print(masses)
masses
is:
[
[[0, 0], [1, 2], [2, 4]],
[[0, 0], [3, 4], [6, 8]],
[[0, 0], [5, 6], [10, 12]]
]
Что должно быть тем, что вы хотите.
Угадайте, как использовать его со списком masses
, оно должно быть:
for i in range(len(masses)):
self.masses[i].l = [j[2*i:2*(i+1)] for j in solution]
Просто убедитесь, что в вашем списке self.masses
достаточно объектов, или вы получите IndexError
.
РЕДАКТИРОВАТЬ после комментариев
Если solution
является массивом Mx2N, это можно сделать так:
import numpy as np
solution = np.array([[0,0,0,0,0,0], [1,2,3,4,5,6], [2,4,6,8,10,12]])
masses = [solution[...,2*i:2*(i+1)] for i in range(int(solution.shape[1]/2))]
masses
is:
[
array([[0, 0], [1, 2], [2, 4]]),
array([[0, 0], [3, 4], [6, 8]]),
array([[0, 0], [5, 6], [10, 12]])
]
Как я уже говорил в комментариях, если вы используете понимание спискаупомянуто, прежде чем это работает, но каждая запись masses
будет списком одномерного массива.Теперь каждая запись masses
является двумерным массивом.
Я не уверен в эффективности, но попробую: индексирование с нулями довольно быстро.
Однако, если вы имеете дело с тоннамиданных, в какой-то момент вам просто нужно мириться с этим.Оптимизация ограничена.
В настройках ООП у вас, скорее всего, есть способ заполнить этот список атрибутов self.masses
.Это должно быть что-то вроде:
def setmasses(self, solution):
for i in range(int(solution.shape[1]/2)):
self.masses[i].l = solution[...,2*i:2*(i+1)]
Боюсь, что в этом случае не так просто избежать цикла for
, потому что вам нужно перебрать список уже существующих объектов.