Julia 中数组的逻辑运算

Jos*_*ath 2 python logic boolean julia

我有两个 1 和 0 的 nxm 矩阵(称为 A 和 B)。我想将它们转换为布尔变量,然后对它们应用“和”和“或”操作。在python中,这很容易:

A = np.array(A, dtype=bool)
B = np.array(B, dtype=bool)
    
A | B 
A & B
Run Code Online (Sandbox Code Playgroud)

但是,我想在 Julia 中做同样的事情,但我遇到了一些问题。我首先通过

A = convert(Array{Bool}, A)
B = convert(Array{Bool},B)
Run Code Online (Sandbox Code Playgroud)

但后来我做了 A&B,我明白了

TypeError: non-boolean (Array{Bool,2}) used in boolean context
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Bog*_*ski 5

我们首先创建存储0-1值的矩阵:

julia> using Random

julia> Random.seed!(1234);

julia> A = rand([0, 1], 3, 4)
3×4 Array{Int64,2}:
 0  0  1  1
 0  1  1  0
 1  0  1  0

julia> B = rand([0, 1], 3, 4)
3×4 Array{Int64,2}:
 1  1  1  0
 0  1  1  1
 0  1  1  1
Run Code Online (Sandbox Code Playgroud)

然后,使用广播.Bool构造得到布尔矩阵:

julia> A_bool = Bool.(A)
3×4 BitArray{2}:
 0  0  1  1
 0  1  1  0
 1  0  1  0

julia> B_bool = Bool.(B)
3×4 BitArray{2}:
 1  1  1  0
 0  1  1  1
 0  1  1  1
Run Code Online (Sandbox Code Playgroud)

同样使用.广播&|运算符来获得你想要的:

julia> A_bool .| B_bool
3×4 BitArray{2}:
 1  1  1  1
 0  1  1  1
 1  1  1  1

julia> A_bool .& B_bool
3×4 BitArray{2}:
 0  0  1  0
 0  1  1  0
 0  0  1  0
Run Code Online (Sandbox Code Playgroud)

请注意,在这种特殊情况下|&在原始矩阵上使用和将获得等效结果(但矩阵将包含0-1整数):

julia> A .| B
3×4 Array{Int64,2}:
 1  1  1  1
 0  1  1  1
 1  1  1  1

julia> A .& B
3×4 Array{Int64,2}:
 0  0  1  0
 0  1  1  0
 0  0  1  0
Run Code Online (Sandbox Code Playgroud)