5

Nx2次元のnumpy配列があります。(2 * N)x 2を作成し、各列を繰り返します。このタスクを実行するために、以下に書いたものよりも効率的な方法があるかどうか知りたいです。

>>> a = np.array([[1,2,3,4],
                  [2,4,6,8]])
>>> b = np.array(zip(a.T,a.T))
>>> b.shape = (2*len(a[0]), 2)
>>> b.T
array([[1, 1, 2, 2, 3, 3, 4, 4],
       [2, 2, 4, 4, 6, 6, 8, 8]])

上記のコードは、おそらく。が原因で、numpy標準では低速zipです。numpy置き換えられる機能はありzipますか?または、これを完全に行うためのより良い方法はありますか?

4

1 に答える 1

7

使用できますrepeat

import numpy as np

def slow(a):
    b = np.array(zip(a.T,a.T))
    b.shape = (2*len(a[0]), 2)
    return b.T

def fast(a):
    return a.repeat(2).reshape(2, 2*len(a[0]))

def faster(a):
    # compliments of WW
    return a.repeat(2, axis=1)

与える

In [42]: a = np.array([[1,2,3,4],[2,4,6,8]])

In [43]: timeit slow(a)
10000 loops, best of 3: 59.4 us per loop

In [44]: timeit fast(a)
100000 loops, best of 3: 4.94 us per loop

In [45]: a = np.arange(100).reshape(2, 50)

In [46]: timeit slow(a)
1000 loops, best of 3: 489 us per loop

In [47]: timeit fast(a)
100000 loops, best of 3: 6.7 us per loop

[アップデート]:

In [101]: timeit faster(a)
100000 loops, best of 3: 4.4 us per loop
于 2012-09-12T21:44:03.923 に答える