2

我有多个 0 和 1 的矩阵,我想找到它们的 NOT 版本。例如:

M  
0 1 0  
1 0 1  
0 1 0

会成为:

!M  
1 0 1  
0 1 0  
1 0 1

现在我有

for row in image:
    map(lambda x: 1 if x == 0 else 0, row)

这工作得很好,但我有一种感觉,我已经看到这真的很简单,只是通过广播。不幸的是,我查到的所有东西都没有敲响。我假设类似的操作将用于对矩阵的值进行阈值处理(即类似的东西1 if x > .5 else 0)。

4

2 回答 2

7

给定一个由 0 和 1 组成的整数数组:

M = np.random.random_integers(0,1,(5,5))
print(M)
# [[1 0 0 1 1]
#  [0 0 1 1 0]
#  [0 1 1 0 1]
#  [1 1 1 0 1]
#  [0 1 1 0 0]]

NOT以下是您可以使用数组的三种方法:

  1. 转换为布尔数组并使用~运算符按位数NOT组:

    print((~(M.astype(np.bool))).astype(M.dtype))
    # [[0 1 1 0 0]
    #  [1 1 0 0 1]
    #  [1 0 0 1 0]
    #  [0 0 0 1 0]
    #  [1 0 0 1 1]]
    
  2. 使用numpy.logical_not并将生成的布尔数组转换回整数:

    print(np.logical_not(M).astype(M.dtype))
    # [[0 1 1 0 0]
    #  [1 1 0 0 1]
    #  [1 0 0 1 0]
    #  [0 0 0 1 0]
    #  [1 0 0 1 1]]
    
  3. 只需从 1 中减去所有整数:

    print(1 - M)
    # [[0 1 1 0 0]
    #  [1 1 0 0 1]
    #  [1 0 0 1 0]
    #  [0 0 0 1 0]
    #  [1 0 0 1 1]]
    

对于大多数非布尔数据类型,第三种方式可能是最快的。

于 2013-09-20T21:21:16.320 回答
1

一种解决方案是将您的数组转换为布尔数组

data = np.ones((4, 4))
bdata = np.array(data, dtype=bool)
print ~bdata
于 2013-09-20T21:20:55.650 回答