Julia 记忆与记忆;计算效率高的重复元素数组创建

Julia 记忆与记忆;计算效率高的重复元素数组创建,julia,Julia,我试图找到一种高效的方法来创建一个新数组,方法是将旧数组的每个元素重复不同的指定次数。我已经提出了一些可行的方法,使用数组理解,但无论是在内存还是在计算方面都不是很有效: LENGTH = 1e6 A = collect(1:LENGTH) ## arbitrary values that will be repeated specified numbers of times NumRepeats = [rand(20:100) for idx = 1:LENGTH] ## arbitrary

我试图找到一种高效的方法来创建一个新数组,方法是将旧数组的每个元素重复不同的指定次数。我已经提出了一些可行的方法,使用数组理解,但无论是在内存还是在计算方面都不是很有效:

LENGTH = 1e6
A = collect(1:LENGTH) ## arbitrary values that will be repeated specified numbers of times
NumRepeats = [rand(20:100) for idx = 1:LENGTH]  ## arbitrary numbers of times to repeat each value in A
B = vcat([ [A[idx] for n = 1:NumRepeats[idx]] for idx = 1:length(A) ]...)

理想情况下,我想要的是一个类似于Julia拥有的稀疏矩阵装置的结构,但它将根据重复值出现的索引高效地存储数据。除此之外,我至少希望有一种有效的方法来创建一个向量,如上面例子中的B。我研究了
repeat()
函数,但从文档和我对该函数的实验中可以看出,它只是用于重复数组的切片,每个切片的重复次数相同。最好的方法是什么?

听起来您正在寻找运行长度编码。这里有一个RLEVOTERS.jl包:。不知道它有多有用。您还可以非常轻松地创建自己的数据类型。

感谢您尝试RLEVectors.jl。master上的一些功能和优化在没有版本升级的情况下一直在衰退。它肯定可以与其他向量混合,用于元素运算。我将把线性代数运算放到特性请求列表中。任何额外的功能建议都是非常受欢迎的。
RLEVectors.jl有一个
rep
函数,它的工作原理类似于R和RLEVectors.inverse\u ree类似于StatsBase.inverse\u rle,但它在运行端而不是长度上工作。

是的,谢谢,就是这样!这些向量的功能似乎仍然有限。特别是,如果我想将一个向量添加到另一个向量,我首先必须将另一个向量转换为一个向量。同样地,我不能用向量做任何形式的矩阵乘法。尽管如此,即使考虑到这些因素,如果我只是修改上面的代码来创建一个RLEVERT,然后使用collect()将其转换为一个正则向量,时间节省也是相当可观的,而且比创建然后收集向量的过程快一点。@Pete,欢迎使用堆栈溢出。您似乎是《生命之路》的作者,希望在这里保留有关您产品的问题。所以我想说,那太好了:-)耐心点,随着声誉的提高,你在这里会有更多的自由。