2014-05-23 2 views
4

나는 패키지 DataFrames로, 단순히Julia의 일부 배열 열에 벡터를 추가하는 방법은 무엇입니까?

julia> df = DataFrame(); 

julia> for i in 1:3 
      df[i] = [i, i+1, i*2] 
     end 

julia> df 
3x3 DataFrame 
|-------|----|----|----| 
| Row # | x1 | x2 | x3 | 
| 1  | 1 | 2 | 3 | 
| 2  | 2 | 3 | 4 | 
| 3  | 2 | 4 | 6 | 

을 수행하여 수, 알고 ...하지만 할 수있는 수단이 빈 Array{Int64,2}에서 같은 있습니까? 행렬의 행에 걸쳐

답변

4

, 당신은 그것을 할 수는 hcat를 사용하여 :

# The number of lines of your final array 
numrows = 3 

# Create an empty array of the same type that you want, with 3 rows and 0 columns: 
a = Array(Int, numrows, 0) 

# Concatenate 3x1 arrays in your empty array: 
for i in 1:numrows 
    b = [i, i+1, i*2] # Create the array you want to concatenate with a 
    a = hcat(a, b) 
end 

공지 사항 여기에, 그 배열 b에는 Int 유형의 요소가 있다는 것을 알고 있습니다. 따라서 동일한 유형의 요소를 갖는 배열 a을 생성 할 수 있습니다.

2

루프 : 당신은 당신이 당신의 마지막 배열에 얼마나 많은 행이 알고있는 경우에

A = zeros(3,3) 
for i = 1:3 
    A[i,:] = [i, i+1, 2i] 
end 
+0

코드가 좋지만 어떻게 4 열을 추가 할 수 있습니까? 내가 필요한 열의 수를 모를 경우 어떻게 구현해야합니까? 감사합니다 – kaslusimoes

+0

Hrm ... 이것이 1d 배열이라면 당신은 밀 수 있습니다! 그리고 팝! 하지만 그 매크로는 2 차원 어레이에서 작동하지 않는 것 같습니다. –

+2

Julia에서 둘 이상의 차원이있는 배열에 행을 추가 할 수 없습니다. 해결책은 행을 벡터로 저장 한 다음'vcat' 또는'hcat'을 사용하여 행렬을 만드는 것입니다. – ivarne

2

가능한 한 처음부터 원하는 열 수를 사용하여 Array를 만드는 것이 가장 좋습니다. 그렇게하면 해당 열 값을 채울 수 있습니다. hcat()과 같은 절차를 사용하는 솔루션은 매번 Array를 다시 생성해야하므로 비효율적입니다.

이미 존재하는 Array에 열을 추가해야하는 경우 hcat() 루프가 아닌 모든 열을 한꺼번에 추가 할 수있는 것이 좋습니다. 예 : 당신이 시작하는 경우 :

for idx = 1:3 
    A = hcat(A, rand(n)) 
end 

일예 :

n = 10; m = 5; 
A = rand(n,m); 

다음

A = [A rand(n, 3)] 

더 빠르고 메모리 효율적인 이상의 것 이 둘 사이의 속도와 메모리 할당의 차이를 비교해보십시오.

n = 10^5; m = 10; 
A = rand(n,m); 
n_newcol = 10; 

function t1(A::Array, n_newcol) 
    n = size(A,1) 
    for idx = 1:n_newcol 
     A = hcat(A, zeros(n)) 
    end 
    return A 
end 

function t2(A::Array, n_newcol) 
    n = size(A,1) 
    [A zeros(n, n_newcol)] 
end 

# Stats after running each function once to compile 
@time r1 = t1(A, n_newcol); ## 0.145138 seconds (124 allocations: 125.888 MB, 70.58% gc time) 
@time r2 = t2(A, n_newcol); ## 0.011566 seconds (9 allocations: 22.889 MB, 39.08% gc time)