1

順序対のリスト(グリッド座標を表す)を保持するためにnumpy配列を使用しています。私が書いているアルゴリズムは、新しく生成された順序対がすでにこの配列にあるかどうかをチェックする必要があります。以下はコードの概略図です。

cluster=np.array([[x1,y1]])
cluster=np.append(cluster,[[x2,y2]],axis=0)
cluster=np.append...etc.

new_spin=np.array([[x,y]])

if new_spin in cluster==False:
    do something

この現在のコードの問題は、誤検知が発生することです。xまたはyがクラスターに表示new_spin in clusterされる場合、trueと評価されます。x最初は、にy表示されるかどうかを尋ねるのが簡単な修正だと思いましたclusterが、これでは順序対として表示されるとは限りません。それらが順序対として表示されることを確認するには、どこxy表示されるかというインデックスを見つけてcluster比較する必要があります。これは非常に不格好でエレガントではないように見えます。もっと良い解決策があるはずです。しかし、私はそれを自分で解決することができませんでした。

助けてくれてありがとう。

4

1 に答える 1

4

例を見てみましょう。

In [7]: import numpy as np
In [8]: cluster = np.random.randint(10, size = (5,2))
In [9]: cluster
Out[9]: 
array([[9, 7],
       [7, 2],
       [8, 9],
       [1, 3],
       [3, 4]])

In [10]: new_spin = np.array([[1,2]])

In [11]: new_spin == cluster
Out[11]: 
array([[False, False],
       [False,  True],
       [False, False],
       [ True, False],
       [False, False]], dtype=bool)

new_spin == clusterdtypeのnumpy配列ですboolclusterの値がの対応する値と等しい場合はTruenew_spinです。

new_spin「in」clusterになるには、上記のブール配列の行すべてTrueである必要があります。このような行は、次のall(axis = 1)メソッドを呼び出すことで見つけることができます。

In [12]: (new_spin == cluster).all(axis = 1)
Out[12]: array([False, False, False, False, False], dtype=bool)

行のすべてがTrueの場合、new_spin「in」も同様です。clusterany

In [13]: 
In [14]: (new_spin == cluster).all(axis = 1).any()
Out[14]: False

ちなみに、これnp.appendは非常に遅い操作です-Pythonよりも遅いですlist.append。を回避すると、パフォーマンスが大幅に向上する可能性がありますnp.append。大きすぎない場合clusterは、少なくともアイテムの追加が完了するまで、クラスターをPythonのリストリストにする方がよい場合があります。次に、必要に応じて、を使用clusterしてnumpy配列に変換しcluster = np.array(cluster)ます。

于 2012-12-15T03:07:59.477 に答える