没有迭代器和/或循环的Numpy数组的组合/笛卡尔积

scl*_*cls 7 python arrays numpy scipy python-itertools

以下代码

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)
Run Code Online (Sandbox Code Playgroud)

输出

(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)
Run Code Online (Sandbox Code Playgroud)

2嵌套for循环也可以输出相同的结果

for i, p1 in enumerate(a_p1):
    for j, p2 in enumerate(a_p2):
        print(p1, p2)
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种解决方案来直接输出具有这种组合的Numpy数组(Numpy数组的元组).

有没有办法在没有迭代器和/或循环的情况下生成这样的Numpy数组?

我知道这样的解决方案比使用迭代器更耗费内存.

Fem*_*der 13

安装Scikit-Learn http://scikit-learn.org/

from sklearn.utils.extmath import cartesian
print cartesian([a_p1, a_p2])
Run Code Online (Sandbox Code Playgroud)

它应该输出

[[ 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]]
Run Code Online (Sandbox Code Playgroud)

这个解决方案来自一个类似的问题: 使用numpy构建一个包含两个数组的所有组合的数组