【问题标题】:The not operator (!) isn't working with array broadcastingnot 运算符 (!) 不适用于数组广播
【发布时间】:2021-02-19 17:37:28
【问题描述】:

我想知道为什么 not 运算符不使用数组广播/元素操作。例如,如果我输入

 x = Array{Any}([1,2,3,4,missing,6])
 !ismissing.(x)

我收到一个错误ERROR: MethodError: no method matching !(::BitArray{1})

但如果我尝试 ismissing.(x) 它工作正常,

ismissing.(x)
#out > 6-element BitArray{1}: 0 0 0 0 1 0

并且在没有广播的情况下打字也可以作为一个整体工作(整个数组的一个输出)

!ismissing(x)
#out > True

所以我想知道是否有可能获得与使用“!”类似的结果运算符。

【问题讨论】:

  • 我建议您不要将数组包装在Array{Any} 构造函数中。这迫使数组具有 eltype Any ,这很慢。相反,让 Julia 找出类型,如下所示:x = [1,2,3,4,missing,6]。这将具有 eltype Union{Missing, Int},编译器可以非常有效地处理它。一般来说,最好将 eltypes 的处理留给编译器,除非您有特定的理由来强制执行您自己的限制。在这种情况下,您将从 ismissing 调用中获得 2 倍的加速。

标签: julia


【解决方案1】:

您还需要向每个元素广播!

julia> x = Array{Any}([1,2,3,4,missing,6]);

julia> .!(ismissing.(x)) # the . comes before operators (!, +, -, etc)
6-element BitVector:
 1
 1
 1
 1
 0
 1

对于这种特定情况,您可以在广播之前否定该函数:

julia> (!ismissing).(x)
6-element BitVector:
 1
 1
 1
 1
 0
 1

【讨论】:

  • 你也可以只写.!ismissing.(x),不用额外的括号。
猜你喜欢
  • 1970-01-01
  • 2020-12-01
  • 2011-04-11
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
相关资源
最近更新 更多