Python 按顺序排列的Numpy并集数组

Python 按顺序排列的Numpy并集数组,python,numpy,Python,Numpy,我有三个不同的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)): [...] 这只是我项目中的一个例子,数组没有排序,我想保持它们的顺序 您可以转置和展平阵列:

我有三个不同的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.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()
这样可以在.flatte()上保存一个副本,因此在大型阵列上可以更快

编辑:如Sven Marnach所述,在这种情况下不保存副本

由于某些原因,vstack比array快:

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))

在这种情况下,使用
ravel()
不会保存副本,因为数据在内存中的排列顺序不正确。使用
vstack()
后,无法避免此副本。当前答案中的代码(我的和你的)总共有两份。这可以通过另一个技巧简化为一个副本–我将在我的答案中添加一些代码。我不确定为什么分配给
d.T[:]
会这么慢。使用
d[:,0],d[:,1],d[:,2]
作为分配目标,而不是在我的机器上将代码速度提高40倍–我再次更新了答案。:)你完全正确。不幸的是,您的新实现并不比第一个vstack+flant/ravel快。事实上,您的上一个版本是:)
reduce (numpy.union1d, (a, b, c))