让我们说我有这两个numpy数组:
a = np.array([1,1,1])
b = np.array([2,2,2])
如何“混合”然后获得以下内容:
c = np.array([1,2,1,2,1,2])
它是否存在像np.concatenate
,np.repeat
,np.tile
这样的功能,我可以使用它还是我必须自己制作?
答案 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)
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