Комбинаторное / декартово произведение массивов Numpy без итераторов и / или циклов

Следующий код

import numpy as np
import itertools

a_p1 = np.arange(0, 4, 1)
a_p2 = np.arange(20, 25, 1)

params = itertools.product(a_p1, a_p2)
for (p1, p2) in params:
    print(p1, p2)

выходы

(0, 20) (0, 21) (0, 22) (0, 23) (0, 24) (1, 20) (1, 21) (1, 22) (1, 23) (1, 24) (2, 20) (2, 21) (2, 22) (2, 23) (2, 24) (3, 20) (3, 21) (3, 22) (3, 23) (3, 24)

2 вложенных цикла for также могут выводить одинаковые результаты

for i, p1 in enumerate(a_p1):
    for j, p2 in enumerate(a_p2):
        print(p1, p2)

Я ищу решение для прямого вывода массива Numpy с такой комбинацией (массив кортежей Numpy).

Есть ли способ сгенерировать такой массив Numpy без итераторов и / или цикла (ов)?

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


person scls    schedule 18.04.2015    source источник
comment
см. связанные: stackoverflow.com/questions/11144513/   -  person EdChum    schedule 18.04.2015


Ответы (1)


Установите Scikit-Learn http://scikit-learn.org/

from sklearn.utils.extmath import cartesian
print cartesian([a_p1, a_p2])

Он должен выводить

[[ 0 20]
 [ 0 21]
 [ 0 22]
 [ 0 23]
 [ 0 24]
 [ 1 20]
 [ 1 21]
 [ 1 22]
 [ 1 23]
 [ 1 24]
 [ 2 20]
 [ 2 21]
 [ 2 22]
 [ 2 23]
 [ 2 24]
 [ 3 20]
 [ 3 21]
 [ 3 22]
 [ 3 23]
 [ 3 24]]

Это решение было взято из аналогичного вопроса: Использование numpy для создания массива всех комбинаций двух массивов

person Femto Trader    schedule 18.04.2015