朱莉娅:如何在朱莉娅中随机置换一个载体?

时间:2016-06-24 09:30:41

标签: julia permute

我有一个随机数的向量,我希望使用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

谢谢

2 个答案:

答案 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可以更好地扩展。