Arrays 朱莉娅:大型阵列的有限打印

Arrays 朱莉娅:大型阵列的有限打印,arrays,printing,julia,Arrays,Printing,Julia,我使用脚本文件在Julia中生成了许多大型数组。打印整个数组很麻烦,但我想检查前几行是否有意义 我知道在REPL中有受屏幕大小限制的打印 julia> zeros(1000,10) 1000×10 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 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.

我使用脚本文件在Julia中生成了许多大型数组。打印整个数组很麻烦,但我想检查前几行是否有意义

我知道在REPL中有受屏幕大小限制的打印

julia> zeros(1000,10)
1000×10 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  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  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  0.0  0.0
0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0
但是我在BaseJulia中找不到任何类似脚本的打印/显示功能,比如只打印出数组的前10行或类似R的
(我本来希望
showcomact
可以这样做)


Julia中是否有类似于R的
head
的函数,还是我必须自己编写

您可以自己轻松定义
head
函数。对于一维和二维,这非常简单:

torange(n::Integer, m) = 1:min(n, m)
torange(c::Colon, m) = (:)

function head(a::AbstractArray{TypeVar(:T), 1}, n = 10)
    view(a, torange(n,size(a,1)))
end


function head(a::AbstractArray{TypeVar(:T), 2}, n1 = 10, n2 = 10)
        view(a, torange(n1, size(a,1)), torange(n2, size(a,2)))
end
torange
方法允许使用
返回相应维度的完整长度。比如说

head(zeros(10, 10), 5, :)
5×10 SubArray{Float64,2,Array{Float64,2},Tuple{UnitRange{Int64},Colon},false}:
 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  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  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  0.0  0.0
对于两个以上的维度,我选择从第三个维度开始重复最后一个论点:

function head{Na, Nn}(a::AbstractArray{TypeVar(:T), Na}, n1 = 10, n2 = 10, ns::Vararg{TypeVar(:T), Nn} = 2)
        nend = last(ns)
        view(a, torange(n1, size(a,1)), torange(n2, size(a,2)), (torange(ns[i], size(a,i+2)) for i = 1:Nn)..., (torange(nend, size(a, i)) for i in Nn+3:Na)...)
end
例如:

head(rand(10, 10, 5, 5), 3, 3, 2)  # the last two is the default value and can be omitted
3×3×2×2 SubArray{Float64,4,Array{Float64,4},Tuple{UnitRange{Int64},UnitRange{Int64},UnitRange{Int64},UnitRange{Int64}},false}:
[:, :, 1, 1] =
 0.384724  0.7328   0.585211
 0.738284  0.95145  0.362914
 0.43928   0.94307  0.758541

[:, :, 2, 1] =
 0.78603   0.588877  0.677201
 0.559547  0.800559  0.488433
 0.993593  0.691884  0.236595

[:, :, 1, 2] =
 0.25732   0.90491   0.323905
 0.300924  0.703919  0.813316
 0.040522  0.776142  0.624097

[:, :, 2, 2] =
 0.746677   0.153574   0.155539 
 0.991624   0.90167    0.0880094
 0.0423263  0.0153597  0.0608328

请注意,n维版本的类型不稳定,但这对于打印来说并不重要。

我们可以通过使用
display()
(这就是您要寻找的…?)获得与REPL相同的输出。此外,“头”和“尾”部分也可以通过使用数组部分打印,例如

disp( x ) = ( display(x) ; println() ; println() )

A = diagm( [ i for i=1:100 ] )

disp( A )
disp( A[ 1:5, : ] )         # head
disp( A[ end-4:end, : ] )   # tail

B = [ i for i=1:100 ]

disp( B )
disp( B[ 1:5 ] )         # head
disp( B[ end-4:end ] )   # tail


正如我在评论中提到的,在v0.5中实现这一点的方法是使用
IOContext

限制数据的一个非常简单的方法是将
:limit=>true
参数传递给
IOContext

julia> show(IOContext(stdout, :limit => true), v)
[0.147959 0.414018 … 0.595528 0.852563; 0.32679 0.824953 … 0.432143 0.036279; … ; 0.877398 0.661854 … 0.197207 0.15596; 0.0522946 0.508075 … 0.835359 0.705987]
但这仍然不能像REPL那样打印出来;这是因为带有两个参数的
show
使用单行显示。要使用多行显示,请将
text/plain
作为第二个参数传递到
show
(MIME类型):

当然,您可以通过将
:displaysize
传递到
IOContext
来更改显示的行数:

julia> show(IOContext(stdout, :limit => true, :displaysize => (10, 10)), "text/plain", v)

100×100 Array{Float64,2}:
 0.147959   …  0.852563
 0.32679       0.036279
 0.754989      0.973622
 ⋮          ⋱          
 0.877398      0.15596 
 0.0522946     0.705987

总的来说,
IOContext
非常灵活。有关更多详细信息,请参阅。

我认为此线程已过时。对于julia v1.4.1中的我来说,显示函数不打印有限的数组,并且

a = zeros(1000,6)
show(IOContext(STDOUT, limit=true), "text/plain", a)
产生一个错误。相反,我发现这是可行的

a = zeros(1000,6)
show(IOContext(stdout, :limit => true), "text/plain", a)

啊,这是一个很好的方法。你知道朱莉娅有没有一种基本的方法可以进行有限的打印吗?我不知道。如果可以在脚本或会话开始时为每个维度设置头和尾的默认最大打印长度,那就太好了。在
Julia 1.6+
中,您可以使用
first(x,10)
last(x,10)
。谢谢,我想这是最好的选择,虽然正如tim所说,最好在最大打印长度上设置一个默认值是的,我同意,而且我还编写了一个自定义的漂亮打印例程,它有更多的控制。但是对于简单的情况,display()对我来说是可以的。虽然我似乎没有通过。。。和你一样的符号。我用的是茱莉亚0.5。所以我必须试着定义我自己的函数。哦,对了,如果我使用v0.5,我没有得到这样的东西,而是一个完整的数字列表。。。。(我在上述试验中使用了v0.4.7)。嗯…啊,对了,也许这是v0.5的问题!在github上提出这个问题可能是值得的……你应该使用IOContext。Julia
=1.6
first(x,1)
是你的
头部
等价物,而
last(x,1)
是你的
尾部
等价物。看:这正是我想要的。谢谢这是我见过的第一个可以理解的IOContext示例+100!
a = zeros(1000,6)
show(IOContext(STDOUT, limit=true), "text/plain", a)
a = zeros(1000,6)
show(IOContext(stdout, :limit => true), "text/plain", a)