首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用numpy构建两个数组的所有组合的数组?

如何使用numpy构建两个数组的所有组合的数组?
EN

Stack Overflow用户
提问于 2018-03-26 08:13:59
回答 2查看 0关注 0票数 0

我试着通过6参数函数的参数空间来研究它的数值行为,然后再尝试做任何复杂的事情,所以我正在寻找一种有效的方法。

首先,我创建了一个函数,该函数接受两个数组,并生成一个数组,其中包含两个数组的所有值组合。

代码语言:txt
复制
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个副本,请执行以下操作:

代码语言:txt
复制
def combs(a,m):
    return reduce(comb,[a]*m)

然后我这样评价我的功能:

代码语言:txt
复制
values = combs(np.arange(0,1,0.1),6)
for val in values:
    print F(val)

这个很管用,但太慢了。我知道参数的空间很大,但这不应该太慢。在这个例子中,我只采样了106个(100万)点,仅仅创建数组就需要超过15秒的时间。values

你知道用Numpy做这件事的更有效的方法吗?

EN

回答 2

Stack Overflow用户

发布于 2018-03-26 16:38:13

这里是一个纯非常规的实现。是卡。比使用迭代工具快5×10。

代码语言:txt
复制
import numpy as np

def cartesian(arrays, out=None):
    """
    Generate a cartesian product of input arrays.

    Parameters
    ----------
    arrays : list of array-like
        1-D arrays to form the cartesian product of.
    out : ndarray
        Array to place the cartesian product in.

    Returns
    -------
    out : ndarray
        2-D array of shape (M, len(arrays)) containing cartesian products
        formed of input arrays.

    Examples
    --------
    >>> cartesian(([1, 2, 3], [4, 5], [6, 7]))
    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]])

    """

    arrays = [np.asarray(x) for x in arrays]
    dtype = arrays[0].dtype

    n = np.prod([x.size for x in arrays])
    if out is None:
        out = np.zeros([n, len(arrays)], dtype=dtype)

    m = n / arrays[0].size
    out[:,0] = np.repeat(arrays[0], m)
    if arrays[1:]:
        cartesian(arrays[1:], out=out[0:m,1:])
        for j in xrange(1, arrays[0].size):
            out[j*m:(j+1)*m,1:] = out[0:m,1:]
    return out
票数 0
EN

Stack Overflow用户

发布于 2018-03-26 18:11:26

在更新版本中numpy(>1.8.x),np.meshgrid提供一个更快的实现:

@PV溶液

代码语言:txt
复制
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:

代码语言:txt
复制
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]])

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100007793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档