2014-05-30 6 views
2

Я пытаюсь развернуть мою голову вокруг Джулии, исходящей от Python. В настоящее время я работаю над некоторыми проблемами Project Euler, которые я решил использовать Python в Julia, чтобы лучше понять язык. Одна вещь, которую я делаю много (в Project Euler и в реальной жизни), заключается в анализе большого многострочного объекта данных в массиве. Например, если у меня есть данныеПроведите многострочную строку в массив

data = """1 2 3 4 
5 6 7 8 
9 0 1 2""" 

В Python я мог бы сделать

def parse(input): 
    output = [] 
    for line in input.splitlines(): 
     output.append(map(int,line.split())) 
    return np.array(output) 

Вот что я до сих пор в Джулии:

function parse(input) 
    nrow = ncol = 0 
    # Count first 
    for row=split(input,'\n') 
     nrow += 1 
     ncol = max(ncol,length(split(row))) 
    end 

    output = zeros(Int64,(nrow,ncol)) 
    for (i,row) in enumerate(split(input,'\n')) 
     for (j,word) in enumerate(split(row)) 
      output[i,j] = int(word) 
     end 
    end 
    return output 
end 

Что версия Julia из «вещий " называется? Как бы то ни было, я не думаю, что я это делаю. Я уверен, что есть способ: (1) не проходить через данные дважды, (2) не обязательно быть настолько конкретным в распределении массива. Я пробовал hcat/vcat немного, без везения.

Я бы приветствовал предложения по его решению. Мне также интересны ссылки на правильный стиль Джулии (julia-onic?) И общие практики использования языка. Благодаря!

ответ

5

readdlm действительно полезен здесь. См. Документы для всех параметров, но вот пример.

julia> data="1 2 3 4 
     5 6 7 8 
     9 0 1 2" 
"1 2 3 4\n5 6 7 8\n9 0 1 2" 

julia> readdlm(IOBuffer(data)) 
3x4 Array{Float64,2}: 
1.0 2.0 3.0 4.0 
5.0 6.0 7.0 8.0 
9.0 0.0 1.0 2.0 

julia> readdlm(IOBuffer(data),Int) 
3x4 Array{Int32,2}: 
1 2 3 4 
5 6 7 8 
9 0 1 2 
+1

Отлично! Благодаря! – Rick

Смежные вопросы