У меня есть массив размером (100, 50) . Мне нужно сгенерировать выходной массив, который представляет собой декартово произведение строк входного массива.

Для упрощения, давайте иметь входной массив:

array([[2, 6, 5],
       [7, 3, 6]])

В качестве вывода я хотел бы иметь:

array([[2, 7],
       [2, 3],
       [2, 6],
       [6, 7],
       [6, 3],
       [6, 6],
       [5, 7],
       [5, 3],
       [5, 6]])

Примечание. itertools.product здесь не работает из-за размера входного вектора. Также все другие аналогичные ответы, предполагает количество строк меньше 32, что здесь не так

-2
zhukovgreen 31 Май 2019 в 10:50

2 ответа

Лучший ответ

Этот вопрос задавался много раз, например здесь.
Массив размером (100, 50) слишком велик и не может быть обработан numpy. Тем не менее, меньший размер массива может быть решен. В любом случае, я предпочитаю использовать itertools для такого рода вещей:

import itertools

a = np.array([[2, 6, 5], [7, 3, 6]])

np.array(list(itertools.product(*a)))
array([[2, 7],
       [2, 3],
       [2, 6],
       [6, 7],
       [6, 3],
       [6, 6],
       [5, 7],
       [5, 3],
       [5, 6]])
1
Artem Zhukov 31 Май 2019 в 13:41
a = np.array([[2, 6, 5],[7, 3, 6]])

out = np.array(np.meshgrid(a[0], a[1])).T.reshape(-1,2)
print(out)

"""
prints
[[2 7]
 [2 3]
 [2 6]
 [6 7]
 [6 3]
 [6 6]
 [5 7]
 [5 3]
 [5 6]]
"""
0
pmarcol 31 Май 2019 в 08:00