Условный itertools.product - PullRequest
       3

Условный itertools.product

0 голосов
/ 28 февраля 2020

Предположим, у меня есть список тяжелых объектов, для аргументов рассмотрим x = numpy.arange(10)/10

Я создал генератор с помощью gen = itertools.product(x,x), чтобы выполнить некоторые вычисления. Дело в том, что мои вычисления симметричны c: для всех i и j, heavy_calc(x[i],x[j]) = heavy_calc(x[j],x[i]).

Следовательно, я хочу вычислить только верхнюю часть матрицы. Как я могу заставить генератор возвращать (x[i], x[j]) только если i >= j?

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

Я бы построил генератор вручную :

def gen(x):
    for i in range(len(x)):
        for y in x[i:]:
            yield(x[i], y)

Это дает, как и ожидалось:

>>> list(gen(list(range(4))))
[(0, 0), (0, 1), (0, 2), (0, 3), (1, 1), (1, 2), (1, 3), (2, 2), (2, 3), (3, 3)]
0 голосов
/ 28 февраля 2020

Используйте itertools.combinations_with_replacement вместо product:

gen = itertools.combinations_with_replacement(x, 2)

Обратите внимание, что это дает (x[i], x[j]) кортежей с i <= j, а не i >= j. Это должно быть хорошо для вашего случая использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...