Как перебирать только определенные позиции в комбинациях Itertool - PullRequest
0 голосов
/ 11 июля 2020

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

Чтобы достичь этого, я повторяю через различные комбинации 0 и 1, чтобы выбрать, требуется ли эта запись для комбинации. 1 означает, что точка данных включена в расчет, а 0 означает, что точка данных не включена.

Таким образом, количество комбинаций будет равно 2 ^ (Количество столбцов Excel)

Пример данных Excel: 1, 22, 7, 11, 2, 4

Пример итерации: (1, 0, 0, 0, 1, 0)

Я мог бы искать, какая комбинация данных Excel даст результат 3, единственная правильная комбинация данных Excel - это итерация выше.

Однако я бы знал, что любое значение больше чем 3, не будет включено в возможную комбинацию, равную 3. Таким образом, я хотел бы выбрать и установить значения этих столбцов на 0 и перебрать только другие столбцы. Это, в свою очередь, уменьшит количество комбинаций. Комбинация = 2 ^ (Количество столбцов Excel - Фиксированные столбцы ввода)

На данный момент я использую Itertools.products для получения всей необходимой мне комбинации:

Numbers = ["0","1"]

for item in itertools.product(Numbers, repeat=len(df.columns)):

    Iteration = pd.DataFrame(item) # Iteration e.g (0,1,1,1,0,0,1)
    
    Data = df.iloc[0] # Excel data row
    
    Data = Data.to_numpy()
    Iteration  = Iteration.astype(float)
    
    Answer = np.dot(Data, Iteration) # Get the result of (Iteration * Data) to check if answer is correct

Это приводит к повторению через комбинации, которые, как я знаю, не сработают. Есть ли способ перебирать только 0 и 1 в определенных позициях комбинации, сохраняя при этом известные записи фиксированным значением (0 или 1), чтобы уменьшить возможные комбинации?

В некоторых файлах Excel содержится более 25 столбцы, которые в результате будут 33 554 432 комбинации. Таким образом, я пытаюсь уменьшить количество столбцов, которые мне нужно перебирать, устанавливая значения для столбцов, которые я знаю.

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

1 Ответ

0 голосов
/ 11 июля 2020

Найдите, какие столбцы соответствуют вашим критериям исключения. Затем просто получите комбинации продуктов для других столбцов.

Один из возможных методов:

from itertools import product

LIMIT=10
column_data = [1, 22, 7, 11, 2, 4]

changeable_indexes = [i for i,x in enumerate(column_data) if x <= LIMIT]

for item in product([0,1], repeat=len(changeable_indexes)):
    row_iteration = [0] * len(column_data)
    for index, value in zip(changeable_indexes, item):
        row_iteration[index]  = value
    print(row_iteration)
...