我试图找到一种有效的方法来创建一个新数组,方法是将旧数组的每个元素重复不同的指定次数。我已经提出了一些有用的东西,使用数组理解,但它在内存或计算中都不是很有效:
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()
函数,但据我从文档和函数实验中可以看出,它只是为每个切片重复一次数组切片。解决这个问题的最佳方式是什么?
答案 0 :(得分:4)
听起来你正在寻找游程编码。这里有一个RLEVectors.jl包:https://github.com/phaverty/RLEVectors.jl。不确定它有多可用。您也可以非常轻松地创建自己的数据类型。
答案 1 :(得分:3)
感谢您尝试使用RLEVectors.jl。一些功能和优化一直在主人身上萎靡而没有版本颠簸。它绝对可以与其他向量混合用于逐元素算术。我将线性代数运算放在功能请求列表中。我们非常欢迎任何其他功能建议。
RLEVectors.jl有一个rep
函数,它的作用类似于R&V; RLEVectors.inverse_ree就像StatsBase.inverse_rle,但它适用于运行结束而不是长度。