Julia中数组的逻辑运算

Posted

技术标签:

【中文标题】Julia中数组的逻辑运算【英文标题】:Logical operations on arrays in Julia 【发布时间】:2021-03-05 15:41:23 【问题描述】:

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

A = np.array(A, dtype=bool)
B = np.array(B, dtype=bool)
    
A | B 
A & B

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

转换为布尔值
A = convert(ArrayBool, A)
B = convert(ArrayBool,B)

然后我做 A&&B,我得到了

TypeError: non-boolean (ArrayBool,2) used in boolean context

我做错了什么?

【问题讨论】:

【参考方案1】:

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

julia> using Random

julia> Random.seed!(1234);

julia> A = rand([0, 1], 3, 4)
3×4 ArrayInt64,2:
 0  0  1  1
 0  1  1  0
 1  0  1  0

julia> B = rand([0, 1], 3, 4)
3×4 ArrayInt64,2:
 1  1  1  0
 0  1  1  1
 0  1  1  1

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

julia> A_bool = Bool.(A)
3×4 BitArray2:
 0  0  1  1
 0  1  1  0
 1  0  1  0

julia> B_bool = Bool.(B)
3×4 BitArray2:
 1  1  1  0
 0  1  1  1
 0  1  1  1

类似地在&| 运算符上使用. 广播来获得你想要的:

julia> A_bool .| B_bool
3×4 BitArray2:
 1  1  1  1
 0  1  1  1
 1  1  1  1

julia> A_bool .& B_bool
3×4 BitArray2:
 0  0  1  0
 0  1  1  0
 0  0  1  0

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

julia> A .| B
3×4 ArrayInt64,2:
 1  1  1  1
 0  1  1  1
 1  1  1  1

julia> A .& B
3×4 ArrayInt64,2:
 0  0  1  0
 0  1  1  0
 0  0  1  0

【讨论】:

请注意,您可以通过 rand(Bool, 3, 4) 获得 Bool 矩阵 - 在这种情况下不需要转换。 是的,但是你会得到一个ArrayBool, 2 而不是BitArray2,这在内存AFAIK 中的存储效率不高。 Bool.(A) 创建一个 BitArray。或者,要创建Bools 矩阵,请使用MatrixBool(A)convert(MatrixBool, A) 是的 - 这就是 Jushuah 所做的,但我想在答案中显示 Bool. 选项,因为它的输入更少:)。

以上是关于Julia中数组的逻辑运算的主要内容,如果未能解决你的问题,请参考以下文章

awk的逻辑运算符

matlab逻辑数组怎么用?

js常用增删改查方法/js比较运算符 逻辑运算符 赋值运算符 算术运算符

javascript基础:逻辑运算符

Excel教程(10) - 逻辑运算符

numpy逻辑运算问题