我有多个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
)。
答案 0 :(得分: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
数组:
转换为布尔数组并使用~
运算符bitwise 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]]
使用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]]
只需从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]]
对于大多数非布尔dtypes,第三种方式可能是最快的。
答案 1 :(得分:1)
一种解决方案是将数组转换为布尔数组
data = np.ones((4, 4))
bdata = np.array(data, dtype=bool)
print ~bdata