2016-03-26 98 views
1

2つのnumpy配列abがあり、2000000要素(浮動小数点数)です。これらの2つの配列の組み合わせ要素が同じ場合は、2つの配列から削除する必要があります。例えば、これら二つの配列から2つのnumpy配列から重複する要素を削除します

a = numpy.array([1,3,6,3,7,8,3,2,9,10,14,6]) 
b = numpy.array([2,4,15,4,7,9,2,2,0,11,4,15]) 

は、我々はa[2]&b[2]a[11]&b[11]と同じである必要があり、我々は削除すべき要素を、複製それを呼び出します。 a[1]&b[1]と同じa[3]&b[3]各配列には重複要素自体がありますが、重複要素としては扱われません。返された配列は次のようになります:

a = numpy.array([1,3,6,7,8,3,2,9,10,14]) 
b = numpy.array([2,4,15,7,9,2,2,0,11,4]) 

誰もがこのような削減を実現するために賢明な方法を持っていますか?

+0

'のB [= B! ] 'と' a [a!= b] 'はうまくいくでしょうか? – Zero

+0

私は試しましたが、期待どおりに動作しません。 –

+0

ああ、間違った質問、np.vstack({np.column_stack((a、b)}})の行の{tuple(行)}は動作するはずです。 – Zero

答えて

2

最初に、abをパックして重複を特定する必要があります。 値は正の整数(それ以外の場合には編集を参照)、これをすることによって達成することができている場合:

val,ind=np.unique(c,return_index=True) 

aで関連する値を取得:

base=a.max()+1 
c=a+base*b 

それからちょうどcに一意の値を見つけますおよびb

ind.sort() 
print(a[ind]) 
print(b[ind]) 

重複を区別するため。(ここでは2つ):

[ 1 3 6 7 8 3 2 9 10 14] 
[ 2 4 15 7 9 2 2 0 11 4] 

EDIT

かかわらず、データ型の、Cアレイは、バイトにデータをパッキング、従うようにすることができる。

ab=ascontiguousarray(vstack((a,b)).T) 
dtype = 'S'+str(2*a.itemsize) 
c=ab.view(dtype=dtype) 
+0

ありがとう。配列の値は正ですが、浮動小数点数です。 –

+0

私はより一般的なアプローチを提供しました。 –

+0

ありがとうございます。できます。あなたのコードは簡潔ですが、それを得るのは簡単ではありません~~~ –

1

これは、1回のパスで実行され、結果の配列に余分なメモリを必要としません。

各インデックスの要素をペアにして繰り返します。これまでにどのペアが見られたのか、アレイのインデックスのカウンタを追跡してください。新しいペアが以前に見られなかった場合、インデックスは1ずつ増加し、効果的に元の場所に戻します。ただし、重複するペアの場合は、インデックスを大きくしないで、新しいペアをすべて1つずつ左に移動します。最後に、配列を短縮するために最初のindex番目の要素を保持してください。

import itertools as it 

def delete_duplicate_pairs(*arrays): 
    unique = set() 
    arrays = list(arrays) 
    n = range(len(arrays)) 
    index = 0 
    for pair in it.izip(*arrays): 
     if pair not in unique: 
      unique.add(pair) 
      for i in n: 
       arrays[i][index] = pair[i] 
      index += 1 
    return [a[:index] for a in arrays] 

Python 2を使用している場合、zip()は、先頭のペアのリストを作成します。あなたの配列に多くの要素があるなら、それを要求するときにペアを作成するitertools.izip()を使う方が効率的です。しかし、Python 3のzip()はデフォルトでそのように動作します。あなたのケースでは

>>> import numpy as np 
>>> a = np.array([1,3,6,3,7,8,3,2,9,10,14,6]) 
>>> b = np.array([2,4,15,4,7,9,2,2,0,11,4,15]) 
>>> a, b = delete_duplicate_pairs(a, b) 
>>> a 
array([ 1, 3, 6, 7, 8, 3, 2, 9, 10, 14]) 
>>> b 
array([ 2, 4, 15, 7, 9, 2, 2, 0, 11, 4]) 

さて、それはすべてあなたの配列が保持する値が何にダウンしています。 0〜9の値しかない場合、100個のユニークなペアがあり、ほとんどの要素が重複しているため、時間が節約されます。 abの2千万の要素については、0〜9の値しか含まれていないため、プロセスは6秒で完了します。 0-999の値の場合は、12秒かかります。

+0

ありがとう、私はそれを試してみます。しかし、私は言及することを忘れて、私が持っている2つの配列は0から50までの浮動小数点数を含んでいます。 –

関連する問題