开发者社区> 问答> 正文

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

我试图在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

展开
收起
保持可爱mmm 2020-02-07 01:05:49 475 0
1 条回答
写回答
取消 提交回答
  • 在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]]) 注意,最终结果的顺序略有不同。

    2020-02-07 01:06:03
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载