继 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/