2017-10-15 79 views
1

以一個矩陣如下所示:如何測試一次數組中是否存在numpy數組或矩陣列中的一個值?

import numpy as np 
m = np.matrix([[1,1], 
       [2,0], 
       [3,1], 
       [5,1], 
       [5,0]]) 

再取兩個測試值:

n1 = 4 
n2 = 1 

如何測試對他們倆的(它保證只有一個,如果有的話將出席)並返回該值?做兩次足夠簡單:

if n1 in m[:, 0]: 
    return n1 
if n2 in m[:, 0]: 
    return n2 

什麼是最好的numpy方式鞏固一個單一的外觀通過m [:,0]?

+0

還有https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.isin.html,雖然我不知道它實際上產生了多少遍。 – user2357112

+0

我認爲最好的可能是'm [:,0]中的值:如果[n1,n2]中的值:返回值'。但我認爲可能會有一些專門爲此而設的numpy。 @ user2357112共享的numpy.isin看起來並不像。 –

回答

2
m[:,0][(m[:,0] == n1) | (m[:,0] == n2)][0,0] 

說明:

m = np.matrix([[1,1], 
      [2,0], 
      [3,1], 
      [5,1], 
      [5,0]]) 
n1 = 4; n2 = 1; 

(m[:,0] == n1)返回一個布爾矩陣爲n1的存在

matrix([[False], 
    [False], 
    [False], 
    [False], 
    [False]], dtype=bool) 

(m[:,0] == n2)返回一個布爾矩陣n2的存在

matrix([[ True], 
     [False], 
     [False], 
     [False], 
     [False]], dtype=bool) 

既然你說的準確和n1參數n2一個將出現在同一時間,|荷蘭國際集團上述兩個將使指數True爲任何現有的參數。

(m[:,0] == n1) | (m[:,0] == n2) 

matrix([[ True], 
     [False], 
     [False], 
     [False], 
     [False]], dtype=bool) 

通過上述布爾數組索引m[:,0]

m[:,0][(m[:,0] == n1) | (m[:,0] == n2)] 

matrix([[1]]) 

我們剛剛得到的第一個元素在它外面

m[:,0][(m[:,0] == n1) | (m[:,0] == n2)][0,0] 
1 

編輯:

後numpy的1.13 + ,正如@John Zwink所示,你可以壓縮ope口糧最後一個爲np.isin(m[:,0], [n1,n2])[:,0],然後只是從中提取出第一個元素np.where(np.isin(m[:,0], [n1,n2])[:,0])[0][0]

+0

Downvoted是因爲? – akilat90

+0

答案的作品,所以我不明白爲什麼這被投票了+1 – kbball

2

你說你想在一次通過m。您可以使用isin()(在NumPy的1.13+):

mask = np.isin(m[:,0], [n1,n2])[:,0] 

這就給了你一個布爾面具其中n1值或N2發現這是真的。採取的第一個這樣的值:

row = np.where(mask)[0][0] 

當然,這需要一個穿過mask其是相同的長度m。如果你想進一步優化,你可能需要使用Numba或Cython來實現一個使用編譯循環的更直接的解決方案。

+0

不知道'isin()'。謝謝! – akilat90

3

如果你需要的簡單性和可讀性,最簡單的可以用一套邏輯發現:

{1,4} & set(m[:,0]) 

此外,該數據實際上是準確讀數一次。

+0

這很美! +1 – akilat90

相關問題