Юля: Как красиво распечатать массив? - PullRequest
4 голосов
/ 13 июля 2020
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 прежним способом внутри функции? Я хочу это для отладки.

Ответы [ 2 ]

5 голосов
/ 13 июля 2020

Иногда вы хотите сохранить эту строку с указанием размера и типа. Следовательно, стоит отметить еще один вариант: 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
4 голосов
/ 13 июля 2020

Позвольте мне здесь прокомментировать, что здесь происходит. Ключевое различие между 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, обычно включает в себя c форматирование и информацию о типе, специфичном для Julia, и по возможности должно быть анализируемым кодом Julia.

repr возвращает вывод show в виде строки.

To настроить вывод текста в удобочитаемом виде для объектов типа T, вместо этого определите show (io :: IO, :: MIME "text / plain", :: T). В таких методах рекомендуется проверять свойство: compact IOContext io, поскольку некоторые контейнеры показывают свои элементы, вызывая этот метод с: 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

и 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

(в обоих случаях я скопировал определения из Base, который вы в конечном итоге получите с использованием операций по умолчанию print(a) и display(a) - пропуская методы, которые вызываются в процессе)

Вы можете найти дополнительную информацию об этом здесь в Руководство Julia.

Итак, в вашем случае - как предложил Джун Тиан, вы можете использовать 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
...