2016-07-01 8 views
1

Ich möchte jedes Tupel X [p] in einer anderen Datei speichern X [1] in mini_batch1.jld X [2] in mini_batch2 ..... aber mein Code speichert (dupliziert) alle Tupel von X [p] in den erstellten Dateien. Nehmen wir ein Beispiel sehen:Julia: Wie Tupel in verschiedenen Dateien speichern?

m= 100 
k= 3 # number of tuples or partition 
y=rand_gen(m,k) 

(3,[[-1.0,1.0,1.0,1.0,-1.0,-1.0,1.0,-1.0,1.0,1.0,-1.0,-1.0,1.0,1.0,-1.0,-1.0,-1.0,1.0,-1.0,1.0,1.0,1.0,1.0,-1.0,-1.0,-1.0,1.0,1.0,1.0,-1.0,1.0,-1.0,1.0,-1.0],[1.0,-1.0,-1.0,-1.0,1.0,1.0,1.0,1.0,-1.0,1.0,-1.0,1.0,-1.0,1.0,1.0,1.0,-1.0,-1.0,1.0,1.0,-1.0,1.0,-1.0,1.0,-1.0,1.0,-1.0,1.0,1.0,-1.0,1.0,-1.0,-1.0],[1.0,-1.0,-1.0,1.0,1.0,-1.0,-1.0,-1.0,1.0,-1.0,1.0,1.0,-1.0,-1.0,-1.0,-1.0,-1.0,1.0,1.0,-1.0,-1.0,1.0,1.0,1.0,1.0,1.0,-1.0,-1.0,-1.0,1.0,1.0,-1.0,1.0]]) 

l haben wollen: mini_batch1 das erste Tupel

[-1.0,1.0,1.0,1.0,-1.0,-1.0,1.0,-1.0,1.0,1.0,-1.0,-1.0,1.0,1.0,-1.0,-1.0,-1.0,1.0,-1.0,1.0,1.0,1.0,1.0,-1.0,-1.0,-1.0,1.0,1.0,1.0,-1.0,1.0,-1.0,1.0,-1.0] 

mini_batch2 das zweite Tupel

[1.0,-1.0,-1.0,-1.0,1.0,1.0,1.0,1.0,-1.0,1.0,-1.0,1.0,-1.0,1.0,1.0,1.0,-1.0,-1.0,1.0,1.0,-1.0,1.0,-1.0,1.0,-1.0,1.0,-1.0,1.0,1.0,-1.0,1.0,-1.0,-1.0] 

und so weiter. Allerdings führt mein Code die Aufgabe aus, die mini_batches-Dateien zu erstellen, speichert jedoch nicht ein Tupel nach dem anderen. Wie kann ich das beheben?

workspace() 
using JLD, HDF5 

function gen_random(m,k) 

    # m the length of the vector , for instance m=100000 and k 
    # the number of partitions let's set k=16 
    s = rand(m) 
    # Pkg.add("JLD"), Pkg.add("HDF5") these two packages are needed 
    # in order to store our vectors in files under the extension jld 
    # allow to convert each random number to -1 or 1 

    X=float_to_binary(s) 
    parts= kfoldperm(length(X),k) 
    # l want to store each tuple X[p] in a different file 
    # X[1] in mini_batch1.jld X[2] in mini_batch2..... 
    # but my code below store all the tuple X[p] in the files created. 
    for p in 1:length(parts) 
     file =jldopen(@sprintf("my path to file/mini_batch%d.jld", p),"w") 
     write(file, "X", [X[p] for p in parts]) 
     close(file) 
    end 
    return [X[p] for p in parts] 

    function float_to_binary(s,level=0.4) 
     for i=1:length(s) 
      s[i] = s[i] > level ? 1.0 : -1.0 
     end 
     file = jldopen("/my path/mydata.jld", "w") 
     write(file, "s", s) # alternatively, say "@write file A" 
     close(file) 
     return s 
    end 


    function kfoldperm(l,k) 
     n,r = divrem(l,k) 
     b = collect(1:n:l+1) 
     for i in 1:length(b) 
      b[i] += i > r ? r : i-1 
     end 
     p = randperm(l) 
     return [p[r] for r in [b[i]:b[i+1]-1 for i=1:k]] 
    end 
+0

Wäre das nicht 'write (Datei„X ", X [p])' mach den Trick? (d. h. das wahrscheinliche Problem ist das Verständnis). – tholy

+0

Nein, es funktioniert nicht, weil es den ersten Wert des ersten Tupels lesen wird. zum Beispiel wenn p = 4. X [1] ist der erste Wert des ersten Tupels, X [2] ist der zweite Wert des ersten Tupels, X [3] der dritte Wert des ersten Tupels, X [4] der vierte Wert des ersten Tupels Tupel. aber ich suche nach dieser Struktur X [1] das ganze erste Tupel, X [2] das ganze zweite Tupel und so weiter – vincet

+0

y = gen_random (m, k) # m = 100, k = 4 zum Beispiel (4 , [[1,0,1,0,1,0,1,0,1,0, -1,0, -1,0, -1,0, -1,0,1,0,1,0, -1,0, -1,0, -1,0,1,0, -1,0,1,0, -1,0, -1,0 , -1,0,1,0, -1,0,1,0,1,0, -1,0], [1,0, -1,0,1,0, -1,0,1,0,1,0,1,0,1,0,1,0,1,0, -1,0,1,0,1,0, -1,0, 1,0, -1,0,1,0, -1,0, -1,0,1,0,1,0, -1,0, -1,0,1,0,1,0], [1,0, -1,0,1,0,1,0, -1,0,1,0, -1,0, -1,0, - 1,0,1,0,1,0,1,0, -1,0, -1,0, -1,0,1,0,1,0, -1,0,1,0, -1,0, -1,0, -1,0, -1,0, -1,0,1,0], [1.0,1.0, - 1,0, -1,0, -1,0,1,0,1,0,1,0, -1,0, -1,0,1,0,1,0,1,0, -1,0, -1,0, -1,0,1,0,1,0, -1,0, -1,0, -1,0,1,0, 1.0, -1.0,1.0]]) – vincet

Antwort

1

Nachdem alle Daten 1 und -1 macht das Beispiel ein wenig schwieriger zu lesen, so dass hier ein Beispiel mit mehr unterscheidbaren Zahlen:

julia> using JLD 

julia> X = Vector{Int}[[1,2], [3,4]] 
2-element Array{Array{Int64,1},1}: 
[1,2] 
[3,4] 

julia> for i = 1:2 
      jldopen("file$i.jld", "w") do file 
       write(file, "X", X[i]) 
      end 
     end 

julia> X1 = load("file1.jld", "X") 
2-element Array{Int64,1}: 
1 
2 

julia> X2 = load("file2.jld", "X") 
2-element Array{Int64,1}: 
3 
4 
+0

es ist nicht das gleiche hier Ich benutze ein Tuple das erste Argument repräsentiert die Anzahl der Tupel innerhalb des Tupels, die 4 ist, dann haben wir die vierten Tupel (4, [[2,3,5], [8,9,15 ], [17, 6, 45, 7], [78, 1, 45, 2]) – vincet

+0

Dann benutze einfach 'write (file," X ", X [2] [i])' – tholy

+0

Oder wenn du das brauchst erstes Element, 'write (file," X ", (1, X [2] [i])). – tholy

Verwandte Themen