2016-12-10 5 views
0

私はあなたが私が入れて少しエキスでそれを見ることができない比較要素は

lista = [(array([ 0., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 0.])), 
(array([ 0., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 1.])), 
(array([ 0., 0., 0.]), array([ 0., 1., 0.]), array([ 0., 0., 0.])), 
(array([ 0., 0., 0.]), array([ 0., 1., 0.]), array([ 0., 0., 1.])), 
(array([ 1., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 0.])), 
(array([ 1., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 1.]))] 

このような何か(ただし、道より大きな)が見える大きなリストを持っているが、いくつかの要素があること繰り返す。重複がなくなることが必要です。

私は

newlist = [] 
for a in lista: 
    if np.all(a not in newlist): 
     newlist.append(a) 

をやって試してみました。しかし、それは仕事をdoesntの、それはそれが動作しない理由を理解しないでください

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

を返します。リストの各要素を配列のリストとして比較する必要があります。

編集:複製はリストの任意の要素にすることができます。ある要素(タプル)が同じ順序で別のタプルと同じ配列を共有する場合は、重複します。

(array([ 0., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 0.])) 
+0

は重複要素を自身で配列、またはメインリスト内の要素はありますか? – TheNavigat

+0

重複は、たとえば '(array([0.、0.、0.])、array([0.、0.、0.])、array([0.、0.、0.、])) ' –

+0

あなたが"重複 "として定義するものはまだ不明です。リスト内の各タプルに対して重複した配列を削除しますか?リスト内のすべてのタプルで複製された配列を削除するか、削除しますか? – sirfz

答えて

1

あなたの複製の定義:正確に同じ配列をリスト内に繰り返すタプル。

import numpy as np 

# list with the 5th tuple being a duplicate of the 1st 
lista = [(array([ 0., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 0.])), 
     (array([ 0., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 1.])), 
     (array([ 0., 0., 0.]), array([ 0., 1., 0.]), array([ 0., 0., 0.])), 
     (array([ 0., 0., 0.]), array([ 0., 1., 0.]), array([ 0., 0., 1.])), 
     (array([ 0., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 0.])), 
     (array([ 1., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 0.])), 
     (array([ 1., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 1.]))] 

clean_list = [] 

for t in lista: 
    for ut in clean_list: 
     if all(np.all(t[i] == ut[i]) for i in range(len(t)))): 
      # duplicate, discard it 
      break 
    else: 
     # does not exist, keep it 
     clean_list.append(t) 

結果clean_listは、第一の複製である第五タプルを除くすべてのタプルが含まれています。

この例では、Pythonに組み込まれたall関数を使用して、渡されたすべての条件の真理をチェックし、比較される配列内のすべての要素の等価性をチェックするためにnumpy.allを使用しています。

+0

私はそれが何をしているのか理解していませんが、それは途中で働いています。それは必要以上の要素を削除しています。存在する要素が '([0.、0.、0.]、[0.、0.、0.]、[0.、0.,1。])' but '([0.、0 。、0.]、[0.、0.、0.]、[0.、0.、2。])も存在し、最も高い番号のものだけを保持しています(両方を保持する必要があります)。 –

+0

完全に等しい配列を含むタプルだけを削除します。あなたの質問を現在の出力と実際の出力の例で更新してください。 – sirfz

+0

さて、それが働くために存在していたループを調整しなければなりませんでした(ループが作成されたので、それを変更する必要がありました)。それはすべてのゼロ配列を含むタプルを削除してしまう問題です。 –

0

私はそれに精通していませんが、「すべて」のメソッドを正しく使用しているかどうかはよく分かりません。ここに参照です:あなたはinを使用する場合https://docs.scipy.org/doc/numpy/reference/generated/numpy.all.html

は、あなただけのpythonを反復あなたの要素との平等のためのリストをチェック、?:

newlist = [] 
for a in lista: 
    if a not in newlist: 
     newlist.append(a) 
+0

私はそのコードを置くと同じエラーが発生します。エラーは '.all()'や '.any()'と関係しているので、それを追加することで修正すると思っていましたが、そうではありません。 –

+0

投稿を更新しました。配列を保持する必要がありますか? – Ben

+0

はい、すべての要素をそのまま(配列のリスト)保持する必要があります。重複を削除するだけです。私はそのコードを実行し、それはまだ動作しません。 –

0

を行うことができませんでした。しかし、等価性チェックでは、[True, False, True]のようなものが得られます。だから、in演算子を使用することはできませんが、all(item==value) for value in list)あなたがinの挙動をシミュレーションしていると、基本的に

newlist = [] 

for line in lista: 
    for item in line: 
     if not any(all(item == value) for value in newlist): 
      newlist.append(item) 

下のチェックでそれをシミュレートすることができ、そしてnot anyで、あなたはチェックのどれもようお願いいたします真でなければならない/

+0

それはものを削除するために働くが、私が必要とするものにはうまくいかない。 'lista'の要素は3つの配列からなるタプルであり、それらはその構造を保持する必要があります。したがって、要素の複製は、基本的に、同じ3つの配列を別の配列と同じ順序で含むタプルです。私はあなたのコードを勉強し、私はそれが働くように変更することができます参照してください。 –

0
import numpy 
from numpy import array 

lista = [(array([ 0., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 0.])), 
(array([ 0., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 1.])), 
(array([ 0., 0., 0.]), array([ 0., 1., 0.]), array([ 0., 0., 0.])), 
(array([ 0., 0., 0.]), array([ 0., 1., 0.]), array([ 0., 0., 1.])), 
(array([ 1., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 0.])), 
(array([ 1., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 1.])), 
(array([ 0., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 0.])), 
(array([ 0., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 1.])), 
(array([ 0., 0., 0.]), array([ 0., 1., 0.]), array([ 0., 0., 0.])), 
(array([ 0., 0., 0.]), array([ 0., 1., 0.]), array([ 0., 0., 1.])), 
(array([ 1., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 0.])), 
(array([ 1., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 1.]))] 

y = [] 

for a in lista: 
    found = 0 
    for b in y: 
     if found >= 3: 
      break 
     found = 0 
     for i in range(0,3): 
      if False in numpy.in1d(a[i], b[i]): 
       break 
      found += 1 
    if found < 3: 
     y.append(a) 

for a in y: 
    print a 

コードは、リスト内の要素の各々を通過し、numpy.in1d(a, b)を使用してタプルに要素を比較します。その結果、3つの要素が一致した場合、項目は重複しています。それ以外の場合は、yに追加されます。

0

すべての行が同じ長さを持って、次のことがあなたの問題を解決すると仮定:

import numpy_indexed as npi 
npi.unique(lista) 
+0

これはタプル(1d)ではなく単一要素次元で動作します。したがって、出力は[[0。 1.] 'を使用します。 – TheNavigat

関連する問題