Декартово произведение с условиями - PullRequest
0 голосов
/ 13 июля 2020

Приведенный ниже код отлично подходит для генерации всех способов комбинирования чисел, суммирующих определенное значение с шагом 2.

Увеличение to_val и axislengh требует значительных потерь. по исполнению.

Есть ли способ повысить эффективность нижеперечисленных? Если да, то не могли бы вы привести пример?

import itertools
import pandas as pd

def yielder(ctproduct):
    for element in ctproduct:
        #Making sure the sum of the numbers is between from_val and to_val.
        if to_val>sum(element)>=from_val:
            yield element
    

axislengh= 4
from_val= 100 
to_val= 104
step=2

#Maybe this is not the best way.
args =[[i for i in range(0, to_val, step)] for x in range(axislengh)]
ctproduct= itertools.product(*args)  


df=pd.DataFrame(yielder(ctproduct))

df

1 Ответ

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

ваш код, вероятно, работает медленно из-за всех используемых вами циклов for. вы можете значительно ускорить код, исключив эти циклы, используя векторизацию или повторяющиеся ссылки на один и тот же объект.

args = axislength * (range(0, to_val, step),)

ctproduct = np.array(list(itertools.product(*args)))
s = ctproduct.sum(axis= 1)

mask = (from_val <= s) & (s < to_val)

df = pd.DataFame(ctproduct[mask])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...