在尝试对其进行任何复杂操作之前,我正在尝试遍历 6 参数函数的参数空间以研究其数值行为,因此我正在寻找一种有效的方法来做到这一点。
我的函数将 6 维 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
然后,我将reduce()其应用于同一数组的 m 个副本:
reduce()
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)
这行得通,但是太慢了 。 我知道参数的空间很大,但这不应该这么慢。在这个例子中,我只采样了 10 6(一百万)个点,仅仅创建数组就花了超过 15 秒values。
values
你知道用 numpy 做这个的更有效的方法吗?
F如果有必要,我可以修改函数接受参数的方式。
F
在numpy(>1.8.x) 的较新版本中,numpy.meshgrid()提供了更快的实现:
numpy
numpy.meshgrid()
@pv 的解决方案
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]])
请注意,最终结果的顺序略有不同。