小编典典

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

all

在尝试对其进行任何复杂操作之前,我正在尝试遍历 6 参数函数的参数空间以研究其数值行为,因此我正在寻找一种有效的方法来做到这一点。

我的函数将 6 维 numpy 数组中给出的浮点值作为输入。我最初尝试做的是:

首先,我创建了一个函数,它接受 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如果有必要,我可以修改函数接受参数的方式。


阅读 110

收藏
2022-07-18

共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]])

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

2022-07-18