# 使用numpy构建两个数组的所有组合的数组

##### 问题描述投票：112回答：9

``````from numpy import *
def comb(a,b):
c = []
for i in a:
for j in b:
c.append(r_[i,j])
return c
``````

``````def combs(a,m):
return reduce(comb,[a]*m)
``````

``````values = combs(np.arange(0,1,0.1),6)
for val in values:
print F(val)
``````

python arrays multidimensional-array numpy
##### 9个回答
79

@pws解决方案

``````In [113]:

%timeit cartesian(([1, 2, 3], [4, 5], [6, 7]))
10000 loops, best of 3: 135 µs per loop
In [114]:

cartesian(([1, 2, 3], [4, 5], [6, 7]))

Out[114]:
array([[1, 4, 6],
[1, 4, 7],
[1, 5, 6],
[1, 5, 7],
[2, 4, 6],
[2, 4, 7],
[2, 5, 6],
[2, 5, 7],
[3, 4, 6],
[3, 4, 7],
[3, 5, 6],
[3, 5, 7]])
``````

`numpy.meshgrid()`仅用于2D，现在它能够使用ND。在这种情况下，3D：

``````In [115]:

%timeit np.array(np.meshgrid([1, 2, 3], [4, 5], [6, 7])).T.reshape(-1,3)
10000 loops, best of 3: 74.1 µs per loop
In [116]:

np.array(np.meshgrid([1, 2, 3], [4, 5], [6, 7])).T.reshape(-1,3)

Out[116]:
array([[1, 4, 6],
[1, 5, 6],
[2, 4, 6],
[2, 5, 6],
[3, 4, 6],
[3, 5, 6],
[1, 4, 7],
[1, 5, 7],
[2, 4, 7],
[2, 5, 7],
[3, 4, 7],
[3, 5, 7]])
``````

149

``````
import numpy as np

def cartesian(arrays, out=None):
"""
Generate a cartesian product of input arrays.

Parameters
----------
arrays : list of array-like
1-D arrays to form the cartesian product of.
out : ndarray
Array to place the cartesian product in.

Returns
-------
out : ndarray
2-D array of shape (M, len(arrays)) containing cartesian products
formed of input arrays.

Examples
--------
>>> cartesian(([1, 2, 3], [4, 5], [6, 7]))
array([[1, 4, 6],
[1, 4, 7],
[1, 5, 6],
[1, 5, 7],
[2, 4, 6],
[2, 4, 7],
[2, 5, 6],
[2, 5, 7],
[3, 4, 6],
[3, 4, 7],
[3, 5, 6],
[3, 5, 7]])

"""

arrays = [np.asarray(x) for x in arrays]
dtype = arrays[0].dtype

n = np.prod([x.size for x in arrays])
if out is None:
out = np.zeros([n, len(arrays)], dtype=dtype)

m = n / arrays[0].size
out[:,0] = np.repeat(arrays[0], m)
if arrays[1:]:
cartesian(arrays[1:], out=out[0:m,1:])
for j in xrange(1, arrays[0].size):
out[j*m:(j+1)*m,1:] = out[0:m,1:]
return out
``````

32

itertools.combinations通常是从Python容器中获取组合的最快方法（如果你确实需要组合，即没有重复和独立于顺序的安排;那不是你的代码似乎在做什么，但我不知道是否那是因为你的代码有问题，或者因为你使用的是错误的术语。

``````for val in itertools.product(np.arange(0, 1, 0.1), repeat=6):
print F(val)
``````

8

``````def cartesian2(arrays):
arrays = [np.asarray(a) for a in arrays]
shape = (len(x) for x in arrays)

ix = np.indices(shape, dtype=int)
ix = ix.reshape(len(arrays), -1).T

for n, arr in enumerate(arrays):
ix[:, n] = arrays[n][ix[:, n]]

return ix
``````

7

``````import numpy
my_grid = numpy.mgrid[[slice(0,1,0.1)]*6]
``````

6

``````import numpy as np

def cartesian_coord(*arrays):
grid = np.meshgrid(*arrays)
coord_list = [entry.ravel() for entry in grid]
points = np.vstack(coord_list).T
return points

a = np.arange(4)  # fake data
print(cartesian_coord(*6*[a])
``````

``````array([[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 0, 2],
...,
[3, 3, 3, 3, 3, 1],
[3, 3, 3, 3, 3, 2],
[3, 3, 3, 3, 3, 3]])
``````

3

2

``````def cartesian(*arrays):
mesh = np.meshgrid(*arrays)  # standard numpy meshgrid
dim = len(mesh)  # number of dimensions
elements = mesh[0].size  # number of elements, any index will do
flat = np.concatenate(mesh).ravel()  # flatten the whole meshgrid
reshape = np.reshape(flat, (dim, elements)).T  # reshape and transpose
return reshape
``````

``````x = np.arange(3)
a = cartesian(x, x, x, x, x)
print(a)
``````

``````[[0 0 0 0 0]
[0 0 0 0 1]
[0 0 0 0 2]
...,
[2 2 2 2 0]
[2 2 2 2 1]
[2 2 2 2 2]]
``````

1

`````` def cartprod(*arrays):
N = len(arrays)
return transpose(meshgrid(*arrays, indexing='ij'),
roll(arange(N + 1), -1)).reshape(-1, N)
``````

``````In [88]: cartprod([1,2,3], [4,8], [100, 200, 300, 400], [-5, -4])
Out[88]:
array([[  1,   4, 100,  -5],
[  1,   4, 100,  -4],
[  1,   4, 200,  -5],
[  1,   4, 200,  -4],
[  1,   4, 300,  -5],
[  1,   4, 300,  -4],
[  1,   4, 400,  -5],
[  1,   4, 400,  -4],
[  1,   8, 100,  -5],
[  1,   8, 100,  -4],
[  1,   8, 200,  -5],
[  1,   8, 200,  -4],
[  1,   8, 300,  -5],
[  1,   8, 300,  -4],
[  1,   8, 400,  -5],
[  1,   8, 400,  -4],
[  2,   4, 100,  -5],
[  2,   4, 100,  -4],
[  2,   4, 200,  -5],
[  2,   4, 200,  -4],
[  2,   4, 300,  -5],
[  2,   4, 300,  -4],
[  2,   4, 400,  -5],
[  2,   4, 400,  -4],
[  2,   8, 100,  -5],
[  2,   8, 100,  -4],
[  2,   8, 200,  -5],
[  2,   8, 200,  -4],
[  2,   8, 300,  -5],
[  2,   8, 300,  -4],
[  2,   8, 400,  -5],
[  2,   8, 400,  -4],
[  3,   4, 100,  -5],
[  3,   4, 100,  -4],
[  3,   4, 200,  -5],
[  3,   4, 200,  -4],
[  3,   4, 300,  -5],
[  3,   4, 300,  -4],
[  3,   4, 400,  -5],
[  3,   4, 400,  -4],
[  3,   8, 100,  -5],
[  3,   8, 100,  -4],
[  3,   8, 200,  -5],
[  3,   8, 200,  -4],
[  3,   8, 300,  -5],
[  3,   8, 300,  -4],
[  3,   8, 400,  -5],
[  3,   8, 400,  -4]])
``````