преобразовать Python список списков в numpy единичную матрицу - PullRequest
0 голосов
/ 02 августа 2020

Я ищу express в чистом виде python, что делает функция np.kron.

Допустим, у меня есть эти списки:

v1 =  [1, 0, 0, 1]
v2 = [1, 0, 0, 1]

i хотел бы определить функцию, которая будет создавать список списков путем умножения v1 на каждый элемент в v2. Таким образом, эти два списка будут создавать 4 списка:

[[1 * v1[0]],[0 * v1[1]],[0 * v1[2]],[1 * v1[3]]]

В настоящее время я могу получить правильные списки из понимания списка:

i = [[a*b for a in v1] for b in v2]

>>[[1, 0, 0, 1], [0, 0, 0, 0], [0, 0, 0, 0], [1, 0, 0, 1]]

эти списки верны, но когда я конвертирую в np.array и переформатируйте его, в квадрантах будут единицы, а не вниз по диагонали:

print(np.array(i).reshape(4,4))

[[1 0 0 1]
 [0 0 0 0]
 [0 0 0 0]
 [1 0 0 1]]

если np.kron передается v1, v2 после преобразования их в массивы numpy он даст:

i2 = np.kron((np.array(v1).reshape(2,2)),(np.array(v2).reshape(2,2)))

[[1 0 0 0]
 [0 1 0 0]
 [0 0 1 0]
 [0 0 0 1]]

- красивая единичная матрица 4 x 4; вот что я ищу express в чистом виде python, а не с помощью функции np kron.

1 Ответ

2 голосов
/ 02 августа 2020

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

Здесь есть две части: как реализовать kron и как изменить форму списка. Один из способов сделать это - создать сетку, которая сообщит вам, какой элемент откуда нужно получить в каждом месте.

Таким образом, индекс в v1 будет выглядеть так:

0 1 0 1
2 3 2 3
0 1 0 1
2 3 2 3

index в v2 выглядит примерно так:

0 0 1 1
0 0 1 1
2 2 3 3
2 2 3 3

Вы можете преобразовать их в выражение в терминах строки r и столбца c. Индекс в v1 выглядит примерно как

i1 = 2 * (r % 2) + (c % 2)

Для v2 вы можете написать

i2 = 2 * (r // 2) + (c // 2)

Если, конечно, это константа 2, которая изменится, если вы попытаетесь по-разному формировать входы или выходы.

Теперь вы можете просто написать вложенное понимание:

output = [[v1[2 * (r % 2) + (c % 2)] * v2[2 * (r // 2) + (c // 2)] for c in range(4)] for r in range(4)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...