2

私は 2 つの numpy 配列を持っていますx(y長さは約 2M です)。順序付けされxていますが、一部の値は同一です。

タスクは、 と の値が同一の場合の両方の値を削除するxことyですx。私の考えはマスクを作ることです。これが私がこれまでに行ったことです:

def createMask(x):
  idx = np.empty(x.shape, dtype=bool)
  for i in xrange(len(x)-1):
    if x[i+1] == x[i]:
      idx[i] = False

  return idx

idx = createMask(x)
x   = x[idx]
y   = y[idx]

この方法は問題なく動作しますが、遅いです ( で 705 ミリ秒%timeit)。また、これは本当に不器用に見えると思います。もっとエレガントで効率的な方法はありますか(確かにあると思います)。

ベストアンサーで更新

2番目の方法は

idx = [x[i+1] == x[i] for i in xrange(len(x)-1)]

そして3番目の(そして最速の)方法は

idx = x[:-1] == x[1:]

結果は次のとおりです(ipythonのを使用%timeit):

最初の方法: 751ms

2 番目の方法: 618ms

3 番目の方法: 3.63ms

両方の方法について、mtitan8 の功績によるものです。

4

1 に答える 1

3

最も速い方法は、xnumpy の==配列演算子を使用して比較することだと思います。

idx = x[:-1] == x[1:]

私のマシンではx、[0, 100] の 100 万個のランダムな整数を使用して、

In[15]: timeit idx = x[:-1] == x[1:]
1000 loops, best of 3: 1 ms per loop
于 2013-10-15T16:38:52.150 に答える