Как я мог оптимизировать этот код с пониманием списка? - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть этот метод, который создает список списков, которые содержат нули и один. например, вывод для (unit = 3): [[1,0,0], [0,1,0], [0,0,1]] как я могу сделать это в меньшем количестве строк с пониманием списка? Я думаю, что одной строки достаточно.

major_list = []  # contains lists full off zeros and ones and at the end converted to a matrix
for i in range(unit):
    major_list.append([0] * unit)
    major_list[i][i] = 1

Ответы [ 6 ]

1 голос
/ 02 апреля 2020

Тестирование производительности различных методов, предложенных здесь, и при условии, что требуемый конечный результат - это список списков (а не numpy массив), самый быстрый, с 2,091 секундами до единицы = 10k:

major_list = [[0] * i + [1] + [0] * (unit - i - 1) for i in range(unit)]

Метод numpy становится:

major_list = numpy.identity(unit).astype(int).tolist()

И второй по скорости с 2.359 se c.

My Метод:

major_list = [[1 if i == index else 0 for i in range(unit)]
    for index in range(unit)]

Отстает с 6,960 SE c.

И последний:

major_list = [[int(c==r) for c in range(unit)] for r in range(unit)]

С 17,732 SE c

1 голос
/ 02 апреля 2020

С помощью списка вы можете присоединиться к 3 подспискам

major_list = [[0] * i + [1] + [0] * (unit - i - 1) for i in range(unit)]
print(major_list)

Или лучше использовать перманентный способ с numpy

major_list = numpy.identity(3)
print(major_list)
1 голос
/ 02 апреля 2020

Вы не можете получить немного быстрее, чем использовать numpy.identity():

np.identity(3)

Код :

import numpy as np

unit = 3
major_array = np.identity(unit)
0 голосов
/ 03 апреля 2020

Вы можете попробовать это:

def frame_matrix(unit):
    return [[int(1)  if i==j else 0 for i in range(unit)] for j in range(unit)]
0 голосов
/ 02 апреля 2020

Это делает его довольно сжатым:

major_list = [[int(c==r) for c in range(unit)] for r in range(unit)]

Это ставит 1, где индекс столбца равен индексу строки, 0 везде.

0 голосов
/ 02 апреля 2020

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

unit = 4
major_list = [
    [ 0 ] * (i) + 
    [ 1 ] +
    [ 0 ] * (unit - i - 1) 
    for i in range(unit)
]

for i in major_list:
    print(i)
[1, 0, 0, 0]
[0, 1, 0, 0]
[0, 0, 1, 0]
[0, 0, 0, 1]
...