2014-03-06 106 views
0

比方說,我有這樣一個矩陣:如何測試一個Python中的矩陣只有1和0?

mat1 = np.array([1,0,1], [1,1,0], [0,0,0]); 

而且我已經得到了一個又一個這樣的:

mat2 = np.array([0,1,0], [0,0,1], [1,1,1]); 

我想檢測是否像

np.add(mat1, mat2); 

只有1或0,即1和0,全0或全1。


n.b. - 評論你的代碼。

回答

2

如何:

>>> def check(matrix): 
...  # flatten up the matrix into one single list 
...  # and set on the list it should be [0,1] if it 
...  # contains only 0 and 1. Then do sum on that will 
...  # return 1 
...  if sum(set(sum(matrix,[]))) > 1: 
...   return False 
...  return True 
... 
>>> 
>>> check([[1,0,1], [1,1,0], [0,0,0]]) 
True 
>>> check([[1,0,1], [1,1,0], [0,0,2]]) 
False 
>>> check([[1,0,1], [1,1,0], [0,0,3]]) 
False 
>>> 
+0

你能評論你的代碼嗎?這裏發生了什麼? – user3333975

+0

我確實請檢查一下 –

+0

嘿,只是在旁邊,我該如何製作一個像mat0 = np.array([[1,2,3],[4,5,6],[7,8,9] ])'扁平化爲一個數組,像'arr0 = np.array([1,2,3,4,5,6,7,8,9])'? – user3333975

4

使用numpy.allnumpy.any

  • 所有0:np.all(mat == 0)
  • 所有1:np.all(mat == 1)
  • 一些0:np.any(mat == 0)
  • 一些1:np.any(mat == 1)

>>> mat1 = np.array([[1,0,1], [1,1,0], [0,0,0]]) 
>>> mat2 = np.array([[0,1,0], [0,0,1], [1,1,1]]) 

>>> np.all(mat1 == 0) 
False 
>>> np.any(mat1 == 0) 
True 
>>> np.all(mat1 == 1) 
False 
>>> np.any(mat1 == 1) 
True 

>>> mat3 = mat1 + mat2 
>>> mat3 
array([[1, 1, 1], 
     [1, 1, 1], 
     [1, 1, 1]]) 
>>> np.all(mat3 == 1) 
True 

UPDATE

檢查數組是否只包含10,閒來無事,使用下列內容:

>>> mat1 = np.array([[1,0,1], [1,1,0], [0,0,0]]) 
>>> mat2 = np.array([[0,1,2], [3,4,5], [6,7,8]]) 
>>> np.all((mat1 == 0) | (mat1 == 1)) 
True 
>>> np.all((mat2 == 0) | (mat2 == 1)) 
False 
+0

你能解釋一下這是什麼意思嗎? – user3333975

+0

@ user3333975,我添加了一個例子,我希望這是有道理的。 – falsetru

+0

我的意思是,如果我加上他們,除了一個是0而其餘的都是1的呢?我不關注 - 但是。 – user3333975

2

簡單:

In [6]: 

set((mat1+mat2).ravel()).issubset(set((1,0))) 
Out[6]: 
True 

In [7]: 

mat3 = np.array([[0,5,0], [0,0,1], [1,1,1]]) 
set((mat1+mat3).ravel()).issubset(set((1,0))) 
Out[7]: 
False 
+0

請解釋... – user3333975

+0

將'mat1'和'mat2'加在一起,'ravel()'表示返回展平視圖(1維)。然後我們做一個'set()'。當結果數組的集合是set((1)),set((1,0))或set((0))時,結果集合是set的一個子集((1 ,0))',這意味着結果數組只有1和0。查看添加的新示例。 –

+0

如果你使用Python 2.7+或3.1+,你可以使用set literals:'{1,0}'而不是'set((1,0))'。 – falsetru

1

如果你知道這是INT D型,則(令人驚訝),它的速度更快,檢查最大和最小(即使沒有doing these operations simultaneously):

In [11]: m = np.random.randint(0, 2, (10, 10)) 

In [12]: %timeit np.all((m == 0) | (m == 1)) 
10000 loops, best of 3: 33.7 µs per loop 

In [13]: %timeit m.dtype == int and m.min() == 0 and m.max() == 1 
10000 loops, best of 3: 29.8 µs per loop 

In [21]: m = np.random.randint(0, 2, (10000, 10000)) 

In [22]: %timeit np.all((m == 0) | (m == 1)) 
1 loops, best of 3: 705 ms per loop 

In [23]: %timeit m.dtype == int and m.min() == 0 and m.max() == 1 
1 loops, best of 3: 481 ms per loop 
+0

注意:如果min不爲0,則此短路。 –

+0

相當不錯。如果它不是int dtype,那麼無論如何你都會在所有其他答案中使用相等運算符。 – gg349

1

您可以使用unique

import numpy as np 
mat1 = np.array([[1,0,1], [1,1,0], [0,0,0]]) 

np.unique(mat1) 
# array([0, 1]) 
1 in np.unique(mat1) 
# True 
0 in np.unique(mat1) 
# True 
np.unique(mat1) == [0, 1] 
# array([ True, True], dtype=bool) 

你也可以使用setdiff1d

np.setdiff1d(mat1, [0, 1]) 
# array([], dtype=int64) 
np.setdiff1d(mat1, [0, 1]).size 
# 0 
+0

注意:np.unique排序,這裏不是問題(雖然這比頂級soln慢),但是如果它有很多項目。 –

+0

fyi,熊貓獨特的功能和numpy完全一樣,但沒有排序。 –

0

檢查了這一點:np.sum(np.unique(mat0.ravel()))


所以,mat0.ravel()做到這一點:

[[1,0,0],[0,0,0],[1,1,0]] ---> [1,0,0,0,0,0,1,1,0] 

這個新的對象是一個數組,即[1,0,0,0,0,0,1,1,0]上述目的。現在,np.unique(mat0.ravel())發現所有的獨特元素,並對其進行排序,並把它們放在一組,像這樣:

[1,0,0,0,0,0,1,1,0] ---> {0,1} 

從這裏,如果一個應用np.sum這一點,即np.sum(np.unique(mat0.ravel()))我們得到的設定內容的總和,因此,檢查了良好的條件,如果僅一個0或在每種和在矩陣的每一個細胞1如下:

np.sum(np.unique(mat0.ravel())) > 1 

NB - 這隻適用於非負整數。

相關問題