混合两个数组。简单。蟒蛇

时间:2015-11-17 23:31:45

标签: python numpy

让我们说我有这两个numpy数组:

a = np.array([1,1,1])
b = np.array([2,2,2])

如何“混合”然后获得以下内容:

c = np.array([1,2,1,2,1,2]) 

它是否存在像np.concatenatenp.repeatnp.tile这样的功能,我可以使用它还是我必须自己制作?

4 个答案:

答案 0 :(得分:3)

这是另一个单行:

np.vstack([a, b]).T.ravel()

或类似地

np.vstack([a, b]).ravel('F')

或者你可以做到

np.concatenate(list(zip(a, b)))

无限的可能性!

答案 1 :(得分:2)

这不是最漂亮的,但你可以这样做:

>>> np.array(zip(a,b)).flatten()
array([1, 2, 1, 2, 1, 2])

但您必须在Python3中执行以下操作:

np.array(list(zip(a,b))).flatten()

由于zip不再返回列表,而是返回生成器(类似于range)。

虽然仅仅是为了记录,看起来最快的方式可能就是John La Rooy的建议(使用转置然后扁平化):

$ python -m timeit 'import numpy as np; a = np.array(range(30)); b = np.array(range(30)); c = np.array(zip(a,b)).flatten()'
10000 loops, best of 3: 24.9 usec per loop
$ python -m timeit 'import numpy as np; a = np.array(range(30)); b = np.array(range(30)); c = np.array([a, b]).T.flatten()'
100000 loops, best of 3: 14.9 usec per loop
$ python -m timeit 'import numpy as np; a = np.array(range(30)); b = np.array(range(30)); c = np.vstack([a, b]).T.ravel()'
10000 loops, best of 3: 21.5 usec per loop

答案 2 :(得分:0)

来自itertools documentation

def roundrobin(*iterables):
    "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
    # Recipe credited to George Sakkis
    pending = len(iterables)
    nexts = cycle(iter(it).__next__ for it in iterables)
    while pending:
        try:
            for next in nexts:
                yield next()
        except StopIteration:
            pending -= 1
            nexts = cycle(islice(nexts, pending))

这很冗长,但其优势在于它将采用不同长度的迭代。

答案 3 :(得分:-1)

尝试这样的事情:

np.concatenate((a, b), axis=0)

还阅读了这篇关于它的更多信息 http://docs.scipy.org/doc/numpy/reference/generated/numpy.concatenate.html