比方說,我有這樣一個矩陣:如何測試一個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. - 評論你的代碼。
比方說,我有這樣一個矩陣:如何測試一個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. - 評論你的代碼。
如何:
>>> 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
>>>
np.all(mat == 0)
np.all(mat == 1)
np.any(mat == 0)
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
檢查數組是否只包含1
或0
,閒來無事,使用下列內容:
>>> 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
你能解釋一下這是什麼意思嗎? – user3333975
@ user3333975,我添加了一個例子,我希望這是有道理的。 – falsetru
我的意思是,如果我加上他們,除了一個是0而其餘的都是1的呢?我不關注 - 但是。 – user3333975
簡單:
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
請解釋... – user3333975
將'mat1'和'mat2'加在一起,'ravel()'表示返回展平視圖(1維)。然後我們做一個'set()'。當結果數組的集合是set((1)),set((1,0))或set((0))時,結果集合是set的一個子集((1 ,0))',這意味着結果數組只有1和0。查看添加的新示例。 –
如果你使用Python 2.7+或3.1+,你可以使用set literals:'{1,0}'而不是'set((1,0))'。 – falsetru
如果你知道這是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
注意:如果min不爲0,則此短路。 –
相當不錯。如果它不是int dtype,那麼無論如何你都會在所有其他答案中使用相等運算符。 – gg349
您可以使用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
注意:np.unique排序,這裏不是問題(雖然這比頂級soln慢),但是如果它有很多項目。 –
fyi,熊貓獨特的功能和numpy完全一樣,但沒有排序。 –
檢查了這一點: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 - 這隻適用於非負整數。
你能評論你的代碼嗎?這裏發生了什麼? – user3333975
我確實請檢查一下 –
嘿,只是在旁邊,我該如何製作一個像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