julia - 在 Julia 中向 DataArray 添加列

标签 julia

关注 How to add vectors to the columns of some array in Julia? ,我想对 DataArrays 进行一些类似的说明。

y=randn(100, 2) .我想创建一个矩阵 x滞后值(与 lags > 0 )为 y .我已经写了一个看起来工作正常的代码(见下文)。我想知道是否有比我使用的更好的连接 DataArray 的方法。

  T, n = size(y);
  x    = @data(zeros(T-lags, 0));

  for lag in 1:lags
    x = hcat(x, y[lags-lag+1:end-lag, :]);
  end

最佳答案

除非有特殊原因,否则我的建议是从您的 DataArray 开始。 x是你想要的大小,然后填写你想要的列值。

与需要重新创建 DataArray 相比,这将为您提供更好的性能。对于每个新列,“添加”列的任何方法实际上都会这样做。可以想象, DataArray 包的语法可能比您在问题中的语法更漂亮,但从根本上说,它仍然会这样做。

因此,在您示例的简化版本中,我建议:

using DataArrays
N = 5; T = 10;
X = @data(zeros(T, N));
initial_data_cols = 2; ## specify how much of the initial data is filled in
lags = size(X,2) - initial_data_cols
X[:,1:initial_data_cols] = rand(size(X,1), initial_data_cols)  ## First two columns of X are fixed in advance


for lag in 1:lags
    X[:,(lag+initial_data_cols)] = rand(size(X,1))
end

如果您确实发现自己需要向已创建的对象添加列,则可以通过首先将所有新对象创建在一起,然后将它们添加到初始对象中,对现有代码进行一些改进数据数组。例如。
X = @data(zeros(10, 2))
X = [X rand(10,3)]

例如,考虑以下两个示例中执行时间、内存分配数量和数量的差异:
n = 10^5; m = 10;
A = @data 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.154082 seconds (124 allocations: 125.888 MB, 75.33% gc time)
@time r2 = t2(A, n_newcol);  ##  0.007981 seconds (9 allocations: 22.889 MB, 31.73% gc time)

关于julia - 在 Julia 中向 DataArray 添加列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39335182/

相关文章:

algorithm - 定点算法中的内存分配

julia - 为什么 Julia 变量不存在于 for 循环的范围内?

linux - 无法运行 julia 文件 - 接近意外标记的语法错误

image - 2018年如何在Julia中将矩阵保存为图像

julia - 格式化数据框字符串列的日期

julia - 将具有常量值的列添加到 DataFrame

Julia:在函数中更新 Float64

Julia:在使用线程时分配 DataFrame 列时出现段错误

julia - 如何在 Julia 中删除数组数组中的数组

parallel-processing - Julia :正确使用pmap