python - 使用numpy构建两个数组的所有组合的数组
我试图在6参数函数的参数空间上运行以研究它的数值行为,然后尝试做任何复杂的事情,这样我才能找到一种有效的方法来做到这一点。
给定6-dim numpy数组作为输入,我的函数采用浮点值。 我最初尝试做的是:
首先,我创建了一个函数,它接受2个数组并生成一个数组,其中包含来自两个数组的所有值组合
from numpy import *
def comb(a,b):
c = []
for i in a:
for j in b:
c.append(r_[i,j])
return c
然后我使用values将其应用于同一阵列的m个副本:
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)
这有效,但它太慢了。 我知道参数的空间很大,但这不应该太慢。 在这个例子中我只采样了106(一百万)个点,并且创建数组values需要超过15秒。
你知道用numpy做这个更有效的方法吗?
我可以修改函数F在必要时使用它的参数的方式。
9个解决方案
149 votes
这是一个纯粹的实现。 它的约。 比使用itertools快5倍。
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],