我试图在6参数函数的参数空间上运行以研究它的数值行为,然后再尝试对其进行任何复杂的处理,因此我正在寻找一种有效的方法来执行此操作。
我的函数在给定6维numpy数组的情况下将float值作为输入。我最初尝试做的是:
首先,我创建了一个函数,该函数接受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个副本:
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。
您知道使用numpy进行此操作的更有效的方法吗?
我可以根据F需要修改函数接受参数的方式。 问题来源于stack overflow
在numpy(> 1.8.x)的较新版本中,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]]) 注意,最终结果的顺序略有不同。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。