我有三个不同的 numpy 数组
a = array([ 0, 3, 6, 9, 12])
b = array([ 1, 4, 7, 10, 13])
c = array([ 2, 5, 8, 11, 14])
我如何使用 numpy 方法加入他们
d = array[(0,1,2,3,4,...,12,13,14)]
我不想写一个像
for i in range(len(a)):
[...]
这只是我项目中的一个示例,数组未排序,我想保持它们的顺序。
您可以转置和展平数组:
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
您可以使用 :
d = np.vstack((a, b, c)).T.ravel()
这在 .flatten() 上节省了一份副本,因此在大型数组上可以更快。
编辑:正如 Sven Marnach 所说,在这种情况下,这不会保存副本。
由于某种原因,vstack 比数组快:
In [1]: a = ones(1e4)
In [2]: b = ones(1e4)
In [3]: c = ones(1e4)
In [4]: %timeit np.vstack((a, b, c)).T.ravel()
1000 loops, best of 3: 265 us per loop
In [5]: %timeit np.vstack((a, b, c)).T.flatten()
1000 loops, best of 3: 268 us per loop
In [6]: %timeit np.array((a, b, c)).T.ravel()
100 loops, best of 3: 5.24 ms per loop
In [7]: def test(a, b, c):
d = numpy.empty((len(a), 3), dtype=a.dtype)
d.T[:] = a, b, c
d = d.ravel()
return d
In [8]: %timeit test(a, b, c)
100 loops, best of 3: 5.06 ms per loop
In [9]: def test2(a, b, c):
d = np.empty((len(a), 3), dtype=a.dtype)
d[:, 0], d[:, 1], d[:, 2] = a, b, c
d = d.ravel()
return d
In [9]: %timeit test2(a, b, c)
10000 loops, best of 3: 69.8 us per loop
试试看...
reduce (numpy.union1d, (a, b, c))