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

使用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如果有必要的话这就是争论。


人到中年有点甜
浏览 2112回答 3
3回答

烙印99

在更新版本中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]])注意,最终结果的顺序略有不同。

四季花海

迭代工具.组合通常是从Python容器中获取组合的最快方法(如果您确实想要组合,即没有重复的排列,并且不依赖于顺序;这不是您的代码看起来要做的事情,但我不知道这是因为您的代码是错误的还是因为您使用了错误的术语)。如果您想要与组合不同的东西-也许是迭代工具中的其他迭代器,product或permutations也许能更好地为你服务。例如,您的代码看起来与以下代码大致相同:for val in itertools.product(np.arange(0, 1, 0.1), repeat=6):     print F(val)所有这些迭代器都会生成元组,而不是列表或numpy数组,因此,如果您的F对获取特定的numpy数组很挑剔,那么您将不得不接受在每一步中构造、清除和重新填充一个数组的额外开销。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python