我试着通过6参数函数的参数空间来研究它的数值行为,然后再尝试做任何复杂的事情,所以我正在寻找一种有效的方法。
首先,我创建了一个函数,该函数接受两个数组,并生成一个数组,其中包含两个数组的所有值组合。
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个副本,请执行以下操作:
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个(100万)点,仅仅创建数组就需要超过15秒的时间。values
。
你知道用Numpy做这件事的更有效的方法吗?
发布于 2018-03-26 18:11:26
在更新版本中numpy
(>1.8.x),np.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]])
注意,最终结果的顺序略有不同。
https://stackoverflow.com/questions/-100007793
复制相似问题