4

私は3つの異なるnumpy配列を持っています

a = array([ 0,  3,  6,  9, 12])
b = array([ 1,  4,  7, 10, 13])
c = array([ 2,  5,  8, 11, 14])

どうすればそれらを結合することができます

d = array[(0,1,2,3,4,...,12,13,14)]

のようなループを書きたくない

for i in range(len(a)):
 [...]

これは私のプロジェクトの単なる例であり、配列はソートされておらず、順序を維持したいと思います。

4

3 に答える 3

5

配列を転置してフラット化できます。

d = numpy.array([a, b, c]).T.flatten()

配列を組み合わせる別の方法は、次を使用することnumpy.vstack()です。

d = numpy.vstack((a, b, c)).T.flatten()

(ちなみに、どちらが速いかわかりません。)

編集Nicolas Barbeyの回答に応えて、データを1回だけコピーする方法は次のとおりです。

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
于 2012-08-06T14:42:47.943 に答える
2

あなたが使用することができます:

d = np.vstack((a, b, c)).T.ravel()

これにより、.flatten()よりも1つのコピーが節約されるため、大規模な配列でより高速になります。

編集: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
于 2012-08-06T14:47:53.717 に答える
1

それを試してみてください...

reduce (numpy.union1d, (a, b, c))
于 2015-01-25T19:14:01.033 に答える