【问题标题】:how to Display Tuple{Float64, Bool}如何显示元组{Float64, Bool}
【发布时间】:2021-08-16 20:35:34
【问题描述】:

我希望元组的布尔部分在作为矩阵的一部分时显示为这样(而不是整数或浮点数)。 代码如下:

a = [(1., true) (1.5 , true) ; (1.5 , false) (-5.5 , false) ]
2×2 Matrix{Tuple{Float64, Bool}}:
 (1.0, 1)  (1.5, 1)
 (1.5, 0)  (-5.5, 0)

但是我希望得到以下结果:

2×2 Matrix{Tuple{Float64, Bool}}:
 (1.0, true)  (1.5, true)
 (1.5, false)  (-5.5, false)

我想我在 Julia 的类型中缺少一些东西;任何帮助表示赞赏。

我偶然发现:

b = [(1., true) (1.5 , true) ; (false, 1.5) (false, -5.5) ]
2×2 Matrix{Tuple{Real, Real}}:
 (1.0, true)   (1.5, true)
 (false, 1.5)  (false, -5.5)

按照我对 a 的预期显示布尔值(第一种情况)。当元组的类型为Tuple{Real, Real} 时,布尔值显示为这样也是出乎意料的。我又一次觉得我错过了什么;欢迎任何指向文档特定部分的指针。 我正在使用 Julia 1.6.1。

【问题讨论】:

    标签: julia


    【解决方案1】:

    默认情况下,Julia 在 0 和 1 等数组中显示 Bool 类型的值,使显示更加紧凑。这样做是为了与位数组兼容(它将布尔值保存在一位中)。例如:

    julia> [true, false]
    2-element Vector{Bool}:
     1
     0
    

    由于我们知道数组元素的类型是 Bool,所以我们知道 1true0false

    但是01 在从类型中明显看出它们是布尔值时使用。对于您的第一种情况,浮点数和布尔值的元组,很明显1 代表true0 代表false

    当从值创建数组时,Julia 对所有值使用一个公共类型,即Real。但是对于第二种情况就不清楚了:1 为真,或者 1 是整数 1。这就是 Julia 在第二种情况下显示 truefalse 的原因。

    如果您想使用只能包含 BoolFloat64 的类型,您可以使用 Union{Float64, Bool} 显式执行此操作。

    因此,如果您想显示truefalse,您可以显式设置联合类型:

    julia> a = Tuple{Union{Float64, Bool}, Union{Float64, Bool}}[(1., true) (1.5 , true) ; (1.5 , false) (-5.5 , false) ]
    2×2 Matrix{Tuple{Union{Bool, Float64}, Union{Bool, Float64}}}:
     (1.0, true)   (1.5, true)
     (1.5, false)  (-5.5, false)
    

    更新:这个例子只是为了解释。如果您的元组中的第二个元素应该只包含 Bool 值,则将其类型更改为 Union{Float64,Bool} 可能会显着影响性能。

    【讨论】:

    • 这会改变a中的数据类型
    • 是的,但是AFAIK没有其他方法可以解决这个问题(除了重载默认显示方法,这是“盗版”)
    • 有意思,谢谢你的解释。你是通过查看显示方法弄清楚的吗?
    • 我找不到解释这一点的文档,但我记得旧版本的 Julia 工作方式不同。它曾经将 [true, false] 打印为 [true, false] 而不是 [1,0]。如果您需要出色的表格打印能力,可以查看 github.com/ronisbr/PrettyTables.jlgithub.com/JuliaData/DataFrames.jl 等软件包
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 2019-11-12
    • 1970-01-01
    • 2021-05-24
    • 2020-06-24
    • 2020-04-07
    • 2013-03-26
    相关资源
    最近更新 更多