Julia:如何漂亮地打印一个数组?

xia*_*dai 18 julia

a= zeros(4,4)
Run Code Online (Sandbox Code Playgroud)

a像这样打印

> 4×4 Array{Float64,2}:
>  0.0  0.0  0.0  0.0
>  0.0  0.0  0.0  0.0
>  0.0  0.0  0.0  0.0
>  0.0  0.0  0.0  0.0
Run Code Online (Sandbox Code Playgroud)

println(a)像这样打印

[0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0]
Run Code Online (Sandbox Code Playgroud)

如何a在函数中以前一种方式“打印” ?我想要它用于调试目的。

Bog*_*ski 16

使用display(x).

让我在这里评论一下这里发生的事情。正如您在文档中所见,关键区别在于show(io, x)和之间show(io, mime, x)

帮助?> show(stdout, a) show([io::IO = stdout], x)

将值 x 的文本表示写入输出流 io。新类型 T 应该重载 show(io::IO, x::T)。show 使用的表示通常包括特定于 Julia 的格式和类型信息,并且应该是可解析的 Julia 代码(如果可能)。

repr 将 show 的输出作为字符串返回。

要为类型 T 的对象自定义人类可读的文本输出,请改为定义 show(io::IO, ::MIME"text/plain", ::T) 。建议在此类方法中检查 io 的 :compact IOContext 属性,因为某些容器通过使用 :compact => true 调用此方法来显示其元素。

所以:

  • show 不使用 MIME 写入对象的文本表示,
  • show with MIME 尝试生成人类可读的格式。

现在print(io, x)回退到show(io, x)你在这里看到的:

function print(io::IO, x)
    lock(io)
    try
        show(io, x)
    finally
        unlock(io)
    end
    return nothing
end
Run Code Online (Sandbox Code Playgroud)

并且display在默认情况下REPL回落到show(io, mime, a)

function display(d::REPLDisplay, mime::MIME"text/plain", x)
    io = outstream(d.repl)
    get(io, :color, false) && write(io, answer_color(d.repl))
    if isdefined(d.repl, :options) && isdefined(d.repl.options, :iocontext)
        # this can override the :limit property set initially
        io = foldl(IOContext, d.repl.options.iocontext,
                   init=IOContext(io, :limit => true, :module => Main))
    end
    show(io, mime, x)
    println(io)
    nothing
end
Run Code Online (Sandbox Code Playgroud)

(在这两种情况下,我都从 Base 中复制了定义,您最终会使用默认print(a)display(a)操作 - 跳过过程中调用的方法)

你可以找到更多关于它的信息,这里的朱莉娅手册。

所以在你的情况下 - 正如君天建议你可以使用display. 也只是为了表明这一切都归结为show

julia> a = zeros(4,4);

julia> show(stdout, a)
[0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0; 0.0 0.0 0.0 0.0]
julia> show(stdout, "text/plain", a)
4×4 Array{Float64,2}:
 0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0
Run Code Online (Sandbox Code Playgroud)


Prz*_*fel 8

有时您想保存显示大小和类型的那一行。因此,另一个值得注意的选择是DelimitedFiles

julia> a= zeros(4,4);

julia> using DelimitedFiles; writedlm(stdout, a)
0.0     0.0     0.0     0.0
0.0     0.0     0.0     0.0
0.0     0.0     0.0     0.0
0.0     0.0     0.0     0.0
Run Code Online (Sandbox Code Playgroud)

  • 事实上,有时它很有用,但对于大型数组(尤其是浮点数)来说,这是有问题的,因为它不使用紧凑的表示,并且不考虑终端的水平和垂直尺寸。例如,比较“rand(100,100)”的“display”和“writedlm”的结果。 (2认同)