您可以转置和扁平化数组:
d = numpy.array([a, b, c]).T.flatten()
另一种组合数组的方法是使用numpy.vstack()
:
d = numpy.vstack((a, b, c)).T.flatten()
我不知道哪个更快,顺便说一下。
编辑: 回应Nicolas Barbey的答案,以下是如何仅拷贝数据一次:
d = numpy.empty((len(a), 3), dtype=a.dtype)
d[:, 0], d[:, 1], d[:, 2] = a, b, c
d = d.ravel()
这段代码确保数据的布局方式不需要进行复制,以便ravel()
函数可以正常运行,实际上在我的电脑上比原始代码快得多:
In [1]: a = numpy.arange(0, 30000, 3)
In [2]: b = numpy.arange(1, 30000, 3)
In [3]: c = numpy.arange(2, 30000, 3)
In [4]: def f(a, b, c):
...: d = numpy.empty((len(a), 3), dtype=a.dtype)
...: d[:, 0], d[:, 1], d[:, 2] = a, b, c
...: return d.ravel()
...:
In [5]: def g(a, b, c):
...: return numpy.vstack((a, b, c)).T.ravel()
...:
In [6]: %timeit f(a, b, c)
10000 loops, best of 3: 34.4 us per loop
In [7]: %timeit g(a, b, c)
10000 loops, best of 3: 177 us per loop
ravel()
不会保存副本,因为数据在内存中的顺序不正确。在使用vstack()
之后,无法避免进行此复制。当前答案(我的和你的)中的代码总共执行了两次复制。可以通过不同的技巧将其减少到一次复制-我将在我的答案中添加一些代码。 - Sven Marnachd.T[:]
赋值会这么慢。使用d[:, 0], d[:, 1], d[:, 2]
作为赋值目标,可以在我的机器上将代码加速40倍 - 我再次更新了我的答案。 :) - Sven Marnach