如何在Julia中将向量添加到某个数组的列中?

5
我知道,使用包DataFrames,只需简单地执行以下操作即可实现。
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}上是否有相同的方法呢?

3个回答

6

如果您知道最终数组中有多少行,可以使用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
如果可能的话,最好一开始就创建具有所需列数的数组。这样,您只需填写这些列值即可。使用像hcat()之类的过程解决方案将效率低下,因为它们需要每次重新创建数组。
如果您确实需要向已经存在的数组添加列,则最好一次性添加所有列,而不是使用hcat()循环添加列。例如,如果您从以下内容开始:
n = 10; m = 5;
A = rand(n,m);

然后。
A = [A rand(n, 3)]

会比以下内容更快,更节省内存:
for idx = 1:3
    A = hcat(A, rand(n))
end

例如,比较这两种方式在速度和内存分配上的差异:
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)

2

循环遍历矩阵的行:

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

你的代码看起来不错,但是我该如何添加第四列呢?我的意思是,如果我不知道需要多少列,我应该如何实现这个功能呢?谢谢。 - kaslusimoes
嗯...如果这是一个一维数组,你可以使用push!和pop!,但是这些宏似乎不适用于二维数组。 - Rob Latham
2
在Julia中,无法将行附加到具有多个维度的数组中。解决方案是将行存储为向量,然后使用vcathcat创建矩阵。 - ivarne
这个使用 hcat 的想法几乎完美!除了已经从向量开始处理初始情况外,我不知道有更好的方法。 - kaslusimoes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接