Создайте новый список из двух списков с помощью умножения. Питон

#python #itertools #matrix-multiplication #cartesian-product

#питон #итерационные инструменты #матрица-умножение #декартово-произведение

Вопрос:

Доброе утро!

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

 import itertools from itertools import product import numpy as np import pandas as pd  Parameter_list=[]  Parameter=[range(0,2,1),range(0,2,1)] Parameter_list=list(itertools.product(*Parameter)) print(Parameter_list)  [(0, 0), (0, 1), (1, 0), (1, 1)]  

Затем я удалил первое значение, которое в основном является нулевой матрицей:

 del Parameter_list[0] print(Parameter_list) [(0, 1), (1, 0), (1, 1)]  

Я продолжил, создав список из двух параметров:

 Parameter_A=[range(1,2,1),range(3,6,2),range(10,20,10)] Parameter_A=list(itertools.product(*Parameter_A))  Parameter_B=[range(0,2,1),range(4,6,2),range(10,20,10)] Parameter_B=list(itertools.product(*Parameter_B))  print(Parameter_A) print(Parameter_B)  [(1, 3, 10), (1, 5, 10)] [(0, 4, 10), (1, 4, 10)]  

И объединил списки:

 comb=list(product(Parameter_A,Parameter_B)) print(comb)  [((1, 3, 10), (0, 4, 10)),  ((1, 3, 10), (1, 4, 10)),   ((1, 5, 10), (0, 4, 10)),   ((1, 5, 10), (1, 4, 10))]  

Пока здесь нет проблем. Но теперь я изо всех сил пытаюсь создать новый список, умножив список параметров на список расчески. Желаемый результат заключается в следующем:

 [((0, 0, 0), (0, 4, 10)),  ((0, 0, 0), (1, 4, 10)),   ((0, 0, 0), (0, 4, 10)),   ((0, 0, 0), (1, 4, 10)),  ((1, 3, 10), (0, 0, 0)),  ((1, 3, 10), (0, 0, 0)),   ((1, 5, 10), (0, 0, 0)),   ((1, 5, 10), (0, 0, 0)),  ((1, 3, 10), (0, 4, 10)),  ((1, 3, 10), (1, 4, 10)),   ((1, 5, 10), (0, 4, 10)),   ((1, 5, 10), (1, 4, 10))]  

Кто-нибудь может мне помочь? Большое спасибо!

Комментарии:

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

2. Список параметров таков: [(0, 1), (1, 0), (1, 1)] Когда список параметров равен (0,1), вы получаете нули в параметре A. Когда список параметров равен (1,0), вы получаете нули в параметре B. Когда список параметров равен (1,0), вы не получаете нулей и в основном только матрицу расчески.

Ответ №1:

Делать это со списками, а не с массивом numpy, не самый удобный выбор. Тем не менее, это все еще то, что вы можете сделать с помощью однострочного.

 prod = [tuple(i if j != 0 else (0,) * len(i) for i, j in zip(comb_items, bool_items))   for comb_items, bool_items in itertools.product(comb, Parameter_list)]  gt;gt;gt; prod [((0, 0, 0), (0, 4, 10)),   ((1, 3, 10), (0, 0, 0)),   ((1, 3, 10), (0, 4, 10)),   ((0, 0, 0), (1, 4, 10)),   ((1, 3, 10), (0, 0, 0)),   ((1, 3, 10), (1, 4, 10)),   ((0, 0, 0), (0, 4, 10)),   ((1, 5, 10), (0, 0, 0)),   ((1, 5, 10), (0, 4, 10)),   ((0, 0, 0), (1, 4, 10)),   ((1, 5, 10), (0, 0, 0)),   ((1, 5, 10), (1, 4, 10))]  

Я предполагаю, что порядок выходных данных не является критичным и что Parameter_list они всегда будут логическими. Обе эти вещи можно довольно легко изменить, если это необходимо.

Комментарии:

1. Спасибо, это именно то, что мне было нужно. Теперь я проверю, что означают bool_items в вашем коде!