【问题标题】:Julia dot operator and booleanJulia 点运算符和布尔值
【发布时间】:2020-05-06 17:20:21
【问题描述】:

假设我有p = [true, true, false, false]q = [true, false, true, false]。我怎么能在逻辑上“和”他们,说像 p .&& q?

【问题讨论】:

    标签: boolean julia


    【解决方案1】:

    改用.&

    julia> p=[true, true, false, false]
    4-element Array{Bool,1}:
     1
     1
     0
     0
    
    julia> q=[true, false, true, false]
    4-element Array{Bool,1}:
     1
     0
     1
     0
    
    julia> p .& q
    4-element BitArray{1}:
     1
     0
     0
     0
    

    您必须小心,因为& 也适用于非Bool 元素:

    julia> [11,12,13] .& [3,2,1]
    3-element Array{Int64,1}:
     3
     0
     1
    

    【讨论】:

    • 扩展正在发生的事情:使用.&,您就是broadcasting 元素方面的“和”操作。广播是一种非常强大的语法,并且随着您的代码变得越来越复杂,它的组合非常好。
    • 在 Bogumil 回答的第二部分中,他警告不要将其应用于布尔数据时会发生什么:该示例显示了当您比较形成 11 和 @987654329 的实际位时会发生什么@... 换句话说,您正在比较...1011(十一)和..0011(三)中的每一位,并得到..0011(三)作为第一个结果。
    • 您可以将数组键入为p = Bool[true, true, false, false],特别是如果它们创建为空Bool[] 然后您开始填充它们。这将使他们只接受布尔值,如果这是您的意图,您需要将非布尔值转换为布尔值,即:bool(x::Int) = x == 0 ? false : true
    • 我发表此评论是因为这是一个常见错误 - 例如使用 DataFrames.jl 的人从中获取一些列,比如 :a - 他们认为它的 eltypeBool 并且他们在上面做 .&,但结果他们默默地得到了错误的结果(他们学习很久以后再说)。
    猜你喜欢
    • 2018-06-05
    • 2011-09-27
    • 2011-03-27
    • 2010-09-23
    • 2013-03-02
    • 2012-09-20
    相关资源
    最近更新 更多