#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 в вашем коде!