Самый быстрый способ создать декартово произведение без дублирующих элементов внутри пары - PullRequest
0 голосов
/ 28 ноября 2018

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

В настоящее время я использую метод itertools.product с циклом for.

pairs = []
for pair in itertools.product(indexes, indexes):
    if pair[0]!=pair[1]:
        pairs.append(pair)

Чтобы решить проблемузанимает много времени, и я не мог использовать свой компьютер, потому что он зависает.

Есть ли лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018
import numpy as np

a = np.asarray(indexes)
b = np.copy(a)

while np.any(a == b):
    b = np.random.choice(a, size=a.shape[0], replace=False)

И должно быть очень быстро

0 голосов
/ 28 ноября 2018

Вы можете сделать это лениво, не сохраняя их:

pairs = filter(lambda x: x[0] != x[1], itertools.product(indexes, indexes))

Используйте itertools.ifilter при использовании python2

Идея использования itertools заключается в том, что выне нужно предварительно вычислять все, но просить вычислить его по одному элементу (вычислению) за раз.

Я сделал сравнение времени, предложенное @Deepak Saini, то есть live here :

import numpy as np
import itertools

indexes = np.arange(1000)

def pairs(indexes):
  pairs = []
  for pair in itertools.product(indexes, indexes):
      if pair[0]!=pair[1]:
          pairs.append(pair)
  return pairs

def iter_pairs(indexes):
  return filter(lambda x: x[0] != x[1], itertools.product(indexes, indexes))

def iter_pairs_no_lambda(indexes):
  def comp(x):
    return x[0] != x[1]
  return filter(comp, itertools.product(indexes, indexes))

import time
for f in (pairs, iter_pairs, iter_pairs_no_lambda):
  print(f.__name__)
  t1 = time.time()
  res = f(indexes)
  print("Took {}".format(time.time() -  t1))

Что приводит к:

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