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。或者,要创建Bool
s 矩阵,请使用MatrixBool(A)
或convert(MatrixBool, A)
。
是的 - 这就是 Jushuah 所做的,但我想在答案中显示 Bool.
选项,因为它的输入更少:)。以上是关于Julia中数组的逻辑运算的主要内容,如果未能解决你的问题,请参考以下文章