2012-11-22 132 views
4

我只是在玩一個粒子模擬器,我想用python和numpy來使用matplotlib儘可能高效地創建逼真的模擬器(這純粹是一種有趣的練習與python),我有一個問題,試圖計算距離的倒數。數組中的Python/Numpy索引

我有一個包含顆粒的像這樣的位置(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] 5個顆粒位置(x,y)的。現在,如果我要計算一個粒子間的距離(說與顆粒位置(0,1)),其餘的我會做類似

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

的問題是我不希望採取的距離粒子本身:(0,0)。這長度爲0,倒數是無限的,並且沒有定義重力或色力。

所以,我試圖: 其中(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]。我如何做這個「numpylike」沒有循環?

ps:如何複製frack到代碼粘貼到stackoverflow?我的意思是不好的論壇有一個[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) 

而這並不是我所期待的,則應該=返回數組WITHOUT [1,1]!但很可惜,它忽略了一個(1,0):

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

EDIT2:任何的伎倆,它更有邏輯上比所有我想,謝謝!

+4

只需複製粘貼,選擇代碼,然後點擊「Ctrl + K」(或「代碼」工具欄按鈕)將其格式化爲代碼。 – voithos

回答

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]),) 
+0

啊謝謝,現在我以爲我有機會獲得numpy索引的聖盃,並且x!= [a,b]並沒有達到我的預期。見上面的編輯。 – arynaq

+0

@ user948652用'!='使用'any'而不是'all'。編輯答案。 –