朱莉娅:如何漂亮地打印一个数组?

31
a= zeros(4,4)

像这样打印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

但是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]

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

如何在函数中以前的方式“打印”变量 a?我需要这个来进行调试。


18
使用 display - Jun Tian
哇,我不知道这个,谢谢! - Johncowk
2个回答

39

使用 display(x)

让我在这里评论一下正在进行的事情。一个关键区别在于 show(io, x)show(io, mime, x) 之间,正如您可以在文档中看到的:

help?> 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 带 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

在REPL中,默认情况下,display 会回退到 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

(在这两种情况下,我已经从基础定义中复制了定义,你最终会使用默认的print(a)display(a)操作获取它们 - 跳过在此过程中调用的方法)
您可以在Julia手册此处找到更多信息。
所以在您的情况下 - 正如Jun Tian建议的那样,您可以使用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

9
有时候您想要保留显示大小和类型的那一行。因此,值得注意的另一个选项是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

3
确实有时候它很有用,但对于大数组(特别是浮点数数组),它是有问题的,因为它不使用紧凑表示,并且不尊重终端的水平和垂直大小。例如,比较rand(100, 100)displaywritedlm的结果。 - Bogumił Kamiński
哦,我喜欢这个 - 它甚至适用于非常长的数组。 - tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接