【问题标题】:JULIA : How to permute randomly a vector in julia?JULIA:如何在 Julia 中随机排列一个向量?
【发布时间】:2016-10-26 21:01:13
【问题描述】:

我有一个随机数向量,我想使用如下所示的 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) 中 ./boot.jl:237

谢谢

【问题讨论】:

  • 因为 randperm() 也用在 matlab 中,而 julia 语言是 matlab 和 python 之间的权衡。实际上功能是一样的,但我不知道为什么它不起作用

标签: julia permute


【解决方案1】:

使用shuffle()

如果您的唯一目标是随机排列向量,您可以使用shuffle()Random 模块的一部分):

julia> using Random;

julia> X = collect(1:5)
5-element Array{Int64,1}:
 1
 2
 3
 4
 5

julia> shuffle(X)
5-element Array{Int64,1}:
 5
 4
 1
 2
 3

如果你不想分配新的向量,但想就地洗牌,可以使用shuffle!()

julia> shuffle!(X);

julia> X
5-element Vector{Int64}:
 3
 4
 2
 5
 1

randperm()

randperm() 接受整数 n 并给出长度为 n 的排列。您可以使用此排序来重新排序原始向量:

julia> X[randperm(length(X))]
5-element Array{Int64,1}:
 3
 4
 1
 2
 5

奖励:无需替换即可采样

您还可以使用 StatsBase.sample() 从数组中采样相同的 length(X) 元素而不进行替换:

julia> import StatsBase;

julia> StatsBase.sample(X, length(X), replace=false)
5-element Vector{Int64}:
 5
 2
 4
 1
 3

【讨论】:

  • 非常感谢,我刚开始学习 julia。感谢您的帮助
  • 这是Random.shuffle btw。或using Random: shuffle
【解决方案2】:

要背负@niczky12 回答中的第二点,如果您想直接随机置换向量X,那么调用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 字节v. 78 Kb),因此使用p 可以更好地扩展。

【讨论】:

  • 基准测试时不要使用全局变量,将所有内容包装在一个函数中。您也可以使用 BenchmarkTools 包
  • 哦,也许这里没关系
  • 这里没关系,因为我试图比较内存分配而不是计算时间。将所有内容包装在函数中是一种很好的 Julia 编码实践。在我的机器上,将脚本包装在一个函数中不会改变结果。
猜你喜欢
  • 2021-09-13
  • 2016-12-23
  • 2018-12-30
  • 2019-04-19
  • 2015-07-06
  • 2015-02-18
  • 1970-01-01
  • 2020-05-28
  • 1970-01-01
相关资源
最近更新 更多