如何测试Python中的矩阵只有1和0?

时间:2014-03-06 05:11:43

标签: python arrays numpy matrix linear-algebra

假设我有一个这样的矩阵:

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。 - 评论您的代码。

6 个答案:

答案 0 :(得分:4)

使用numpy.allnumpy.any

  • 全部0:np.all(mat == 0)
  • 全部1:np.all(mat == 1)
  • 某些0:np.any(mat == 0)
  • some 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

<强>更新

要检查数组是否仅包含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

答案 1 :(得分: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

答案 2 :(得分: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
>>>

答案 3 :(得分:1)

如果您知道它的类型,那么(令人惊讶的是)检查最大值和最小值(即使没有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

答案 4 :(得分: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

答案 5 :(得分: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或{{矩阵中的每个单元格中的1}}如下:

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

n.b。 - 这仅适用于非负整数。