为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

人到中年有点甜 2019-06-19 19:23:10
使用numpy构建两个数组的所有组合的数组我试图通过6参数函数的参数空间来研究它的数值行为,然后再尝试做任何复杂的事情,所以我正在寻找一种有效的方法来做到这一点。我的函数以浮点值作为输入,给定一个6昏暗的numpy数组。我最初想做的是:首先,我创建了一个函数,该函数接受两个数组,并从两个数组生成一个包含所有值组合的数组。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(100万个)在这个例子中,创建数组花费了超过15秒的时间。values.你知道用Numpy做这件事的更有效的方法吗?我可以修改函数的方式F如果有必要的话这就是争论。
查看完整描述

3 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

在更新版本中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 loopIn [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 loopIn [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]])

注意,最终结果的顺序略有不同。


查看完整回答
反对 回复 2019-06-19
?
四季花海

TA贡献1811条经验 获得超5个赞

迭代工具.组合通常是从Python容器中获取组合的最快方法(如果您确实想要组合,即没有重复的排列,并且不依赖于顺序;这不是您的代码看起来要做的事情,但我不知道这是因为您的代码是错误的还是因为您使用了错误的术语)。

如果您想要与组合不同的东西-也许是迭代工具中的其他迭代器,productpermutations也许能更好地为你服务。例如,您的代码看起来与以下代码大致相同:

for val in itertools.product(np.arange(0, 1, 0.1), repeat=6):
    print F(val)

所有这些迭代器都会生成元组,而不是列表或numpy数组,因此,如果您的F对获取特定的numpy数组很挑剔,那么您将不得不接受在每一步中构造、清除和重新填充一个数组的额外开销。


查看完整回答
反对 回复 2019-06-19
  • 3 回答
  • 0 关注
  • 2111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信