4

パーティクルシミュレーターで遊んでいます。matplotlibとpythonおよびnumpyを使用して、可能な限り効率的にシミュレーターを現実的にしたいと考えています(これは、純粋にpythonを楽しんでいる演習です)。計算に問題があります。距離の逆数。

私は次のように粒子(x、y)の位置を含む配列を持っています:

x = random.randint(0,3,10).reshape(5,2)
>>> x
array([[1, 1],
   [2, 1],
   [2, 2],
   [1, 2],
   [0, 1]])

これは、[0,3]の位置(x、y)を持つ5つのパーティクルです。ここで、1つのパーティクル(たとえば、位置が(0,1)のパーティクル)と残りのパーティクルの間の距離を計算する場合は、次のようにします。

>>>x - [0,1]
array([[1, 0],
   [2, 0],
   [2, 1],
   [1, 1],
   [0, 0]])

問題は、パーティクルからそれ自体までの距離(0,0)を取得したくないことです。これの長さは0で、その逆数は無限大であり、重力やクーロン力などには定義されていません。

だから私は試しました:where(x == [0,1])

>>>where(x==[0,1])
(array([0, 1, 4, 4]), array([1, 1, 0, 1]))

これは、x配列内の(0,1)パーティクルの位置ではありません。では、xのような配列から[0,1]の位置を選択するにはどうすればよいですか?上記のwhere()は、xが[0,1]に等しい場合ではなく、xが0または1に等しい場合をチェックします。ループせずにこの「しつこい」を行うにはどうすればよいですか?

追伸:コードをどのようにコピーしてスタックオーバーフローに貼り付けますか?つまり、悪いフォーラムには[code] .. [/ code]オプションがありますが、ここでは15分かけてコードを適切にインデントします(ubuntuのクロムのタブは4つの空白でインデントするのではなく、ウィンドウから飛び出すだけなので...)これ非常に迷惑です。

編集:私が試した最初の答えを見て:

x
array([[0, 2],
       [2, 2],
       [1, 0],
       [2, 2],
       [1, 1]])
>>> all(x==[1,1],axis=1)
array([False, False, False, False,  True], dtype=bool)
>>> all(x!=[1,1], axis=1)
array([ True,  True, False,  True, False], dtype=bool)

これは私が望んでいたことではありませんが、!=は[1,1]なしで配列を返す必要があります。しかし、残念ながら、それは1つ(1,0)を逃します:

>>>x[all(x!=[1,1], axis=1)]
array([[0, 2],
       [2, 2],
       [2, 2]])

Edit2:トリックをした人は誰でも、私が思うすべてよりも論理的に理にかなっています、ありがとう!

4

1 に答える 1

5
>>> import numpy as np
>>> x=np.array([[1, 1],
...    [2, 1],
...    [2, 2],
...    [1, 2],
...    [0, 1]])
>>> np.all(x==[0,1], axis=1)
array([False, False, False, False,  True], dtype=bool)
>>> np.where(np.all(x==[0,1], axis=1))
(array([4]),)
>>> np.where(np.any(x!=[0,1], axis=1))
(array([0, 1, 2, 3]),)
于 2012-11-22T19:10:04.100 に答える