我有一个随机数的向量,我希望使用randperm()函数随机置换,如下所示,但它不起作用。
X=rand(100000) # a vector of 100000 random elements
Y=randperm(X) # want to permute randomly the vector x
返回的错误是: 错误:MethodError:没有匹配randperm的方法(:: Array {Float64,1}) 在eval(:: Module,:: Any)at ./boot.jl:237
谢谢
答案 0 :(得分:8)
根据docs randperm()
接受整数n
并给出长度为n的排列。您可以使用此顺序然后重新排序原始矢量:
julia> X = collect(1:5)
5-element Array{Int64,1}:
1
2
3
4
5
julia> Y = X[randperm(length(X))]
5-element Array{Int64,1}:
3
4
1
2
5
您可以随时在REPL中输入?function_name
来检查文档。
如果您的唯一目标是随机置换矢量,您还可以使用shuffle()
:
julia> shuffle(X)
5-element Array{Int64,1}:
5
4
1
2
3
答案 1 :(得分:2)
如果你想直接随机置换向量X
,那么要回答@ niczky12的答案中的第二点,那么调用shuffle!(X)
而不是shuffle(X)
实际上更有效率:
# precompile @time
@time 1+1
# create random vector
p = 10_000
X = collect(1:p)
# reproducible shuffles
srand(2016)
shuffle(X)
@time shuffle(X)
shuffle!(X)
@time shuffle!(X)
我机器上的输出:
0.000004 seconds (148 allocations: 10.151 KB)
0.000331 seconds (6 allocations: 78.344 KB)
0.000309 seconds (4 allocations: 160 bytes)
对shuffle!
的调用分配的内存大大减少(160字节对78 Kb),因此p
可以更好地扩展。