假设我有这样的矩阵:
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。 - 评论您的代码。
使用numpy.all
,numpy.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
检查数组是否仅包含 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
怎么样:
>>> 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
>>>
简单:
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
如果您知道它是int dtype ,那么(令人惊讶的是)检查最大和min(即使不同时执行这些操作)速度更快:
>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
您可以使用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.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
n.b。 - 这仅适用于非阴性整数。