2016-11-24 1 views
7

Je produis un certain nombre de grands tableaux dans Julia en utilisant un fichier de script. L'impression de tout le tableau est fastidieuse mais j'aimerais vérifier si les premières lignes ont du sens.Julia: impression limitée de grands tableaux

Je sais que dans le REPL il y a une impression qui est limitée par la taille de l'écran, par ex.

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 

Mais je ne peux trouver aucune impression/fonction show dans la base Julia qui imite ce pour les scripts, disons que l'impression sur les 10 premières lignes d'un tableau ou quelque chose comme R de head (je me serais attendu showcompact à faire quelque chose comme ça).

Existe-t-il une fonction analogue à celle de R head dans Julia ou dois-je écrire la mienne.

+0

Vous devez utiliser IOContext pour cela. –

Répondre

10

Comme je l'ai mentionné dans un commentaire, la façon de le faire dans v0.5 est d'utiliser un IOContext.

Un moyen très simple de limiter les données est de passer le paramètre limit=true au 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] 

Mais cela n'imprime toujours pas comme le fait REPL; C'est parce que show avec deux arguments utilise un affichage sur une seule ligne. Pour utiliser un écran multiligne, passer text/plain comme second argument à show (type MIME):

julia> show(IOContext(STDOUT, limit=true), "text/plain", v) 
100×100 Array{Float64,2}: 
0.147959 0.414018 0.0282934 … 0.816132 0.595528 0.852563 
0.32679 0.824953 0.0582351  0.822526 0.432143 0.036279 
0.754989 0.724317 0.533966  0.987273 0.931932 0.973622 
0.547866 0.282694 0.0295411  0.75929 0.886218 0.0813057 
0.0626663 0.111795 0.625083  0.439983 0.562143 0.669046 
0.712093 0.469622 0.377298 … 0.298224 0.31853 0.376066 
0.774625 0.754328 0.756725  0.61113 0.76566 0.999292 
0.917846 0.308363 0.489246  0.715311 0.175302 0.124059 
0.310922 0.140575 0.20635  0.0280192 0.683004 0.168129 
0.753361 0.755103 0.831806  0.118009 0.122374 0.281476 
⋮        ⋱         
0.420264 0.7614  0.748408  0.330983 0.0776789 0.309464 
0.984379 0.851735 0.595121  0.534982 0.255317 0.743713 
0.814505 0.765941 0.71852  0.730677 0.477631 0.0360992 
0.910384 0.0747604 0.490685  0.0904559 0.0756424 0.313898 
0.628416 0.0790874 0.401488 … 0.523521 0.397249 0.58112 
0.578361 0.336352 0.261118  0.838256 0.387374 0.451647 
0.66724 0.586342 0.378968  0.602694 0.450686 0.901279 
0.877398 0.661854 0.685156  0.658952 0.197207 0.15596 
0.0522946 0.508075 0.244423  0.95935 0.835359 0.705987 

Vous pouvez bien sûr changer le nombre de lignes sont montrées en passant displaysize au 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 

Dans l'ensemble, IOContext est très flexible. Voir sa documentation pour plus de détails.

+0

C'est exactement ce que je voulais. Merci! – Jack

+0

C'est le premier exemple compréhensible de IOContext que j'ai vu. +100! –

3

Vous pouvez facilement définir une fonction head vous-même. Pour une et deux dimensions, cela est assez simple:

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 

La méthode torange permet d'utiliser un : pour revenir sur toute la longueur de la dimension correspondante. Par exemple

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 

Pour plus de deux dimensions, j'ai choisi de répéter le dernier argument à partir de la troisième:

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 

Par exemple:

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 

Notez que le n La version dimensionnelle n'est pas stable en termes de type, mais cela ne devrait pas avoir d'importance pour l'impression.

+0

Aah c'est un bon moyen de le faire. Savez-vous s'il existe une méthode de base qui limite l'impression à Julia? – Jack

+0

Je ne sais pas. Il serait bien que la longueur d'impression maximale par défaut de l'en-tête et de la queue puisse être définie pour chaque dimension au début d'un script ou d'une session. – tim

3

On peut obtenir le même résultat que REPL à l'aide display() (est-ce que vous cherchez ...?) En outre, les parties « tête » et « queue » peut être imprimé en utilisant des sections de tableau, par exemple,

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 

$ julia test.jl 

100x100 Array{Int64,2}: 
1 0 0 0 0 0 0 0 0 0 0 0 … 0 0 0 0 0 0 0 0 0 
0 2 0 0 0 0 0 0 0 0 0 0  0 0 0 0 0 0 0 0 0 
0 0 3 0 0 0 0 0 0 0 0 0  0 0 0 0 0 0 0 0 0 
0 0 0 4 0 0 0 0 0 0 0 0  0 0 0 0 0 0 0 0 0 
0 0 0 0 5 0 0 0 0 0 0 0  0 0 0 0 0 0 0 0 0 
0 0 0 0 0 6 0 0 0 0 0 0 … 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 7 0 0 0 0 0  0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 8 0 0 0 0  0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 9 0 0 0  0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 10 0 0  0 0 0 0 0 0 0 0 0 
⋮    ⋮    ⋮  ⋱     ⋮     
0 0 0 0 0 0 0 0 0 0 0 0  92 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0  0 93 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0  0 0 94 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0  0 0 0 95 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 … 0 0 0 0 96 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0  0 0 0 0 0 97 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0  0 0 0 0 0 0 98 0 0 
0 0 0 0 0 0 0 0 0 0 0 0  0 0 0 0 0 0 0 99 0 
0 0 0 0 0 0 0 0 0 0 0 0  0 0 0 0 0 0 0 0 100 

5x100 Array{Int64,2}: 
1 0 0 0 0 0 0 0 0 0 0 0 0 … 0 0 0 0 0 0 0 0 0 0 0 0 
0 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 3 0 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 0 0 0 0 0 0 0 0 0  0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 5 0 0 0 0 0 0 0 0  0 0 0 0 0 0 0 0 0 0 0 0 

5x100 Array{Int64,2}: 
0 0 0 0 0 0 0 0 0 0 0 0 0 … 0 0 0 0 0 96 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0  0 0 0 0 0 0 97 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0  0 0 0 0 0 0 0 98 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0  0 0 0 0 0 0 0 0 99 0 
0 0 0 0 0 0 0 0 0 0 0 0 0  0 0 0 0 0 0 0 0 0 100 

100-element Array{Int64,1}: 
    1 
    2 
    3 
    4 
    5 
    6 
    7 
    8 
    9 
    10 
    ⋮ 
    92 
    93 
    94 
    95 
    96 
    97 
    98 
    99 
100 

5-element Array{Int64,1}: 
1 
2 
3 
4 
5 

5-element Array{Int64,1}: 
    96 
    97 
    98 
    99 
100 
+0

Merci, je suppose que c'est la meilleure option, mais comme Tim dit serait bien de définir un défaut sur la longueur d'impression maximale – Jack

+0

Oui, je suis d'accord, et j'écris aussi une routine d'impression personnalisée qui a plus de contrôle. Mais pour les cas simples display() est OK pour moi. – roygvib

+0

Bien que je ne semble pas obtenir les «limites automatiques» avec la notation ... comme vous le faites. J'utilise Julia 0.5. Je vais donc devoir simplement essayer de définir ma propre fonction. – Jack