Expanding Vector List Each by List of Instances - Julia
I would like to expand a vector of values each by a vector containing the number of each instance. I have come up with the following code which does the job but it seems like this is a common use so I am probably missing something.
valuelist = ["a","b","d","z"]
numberofinstance = [3,5,1,11]
valuevector = String
for i in 1:length(numberofinstance)
append!(valuevector , repeat([valuelist[i]], numberofinstance[i]))
end
julia expand
add a comment |
I would like to expand a vector of values each by a vector containing the number of each instance. I have come up with the following code which does the job but it seems like this is a common use so I am probably missing something.
valuelist = ["a","b","d","z"]
numberofinstance = [3,5,1,11]
valuevector = String
for i in 1:length(numberofinstance)
append!(valuevector , repeat([valuelist[i]], numberofinstance[i]))
end
julia expand
I found the function in StatsBase.jl. See my updated answer.
– crstnbr
Jan 2 at 19:22
add a comment |
I would like to expand a vector of values each by a vector containing the number of each instance. I have come up with the following code which does the job but it seems like this is a common use so I am probably missing something.
valuelist = ["a","b","d","z"]
numberofinstance = [3,5,1,11]
valuevector = String
for i in 1:length(numberofinstance)
append!(valuevector , repeat([valuelist[i]], numberofinstance[i]))
end
julia expand
I would like to expand a vector of values each by a vector containing the number of each instance. I have come up with the following code which does the job but it seems like this is a common use so I am probably missing something.
valuelist = ["a","b","d","z"]
numberofinstance = [3,5,1,11]
valuevector = String
for i in 1:length(numberofinstance)
append!(valuevector , repeat([valuelist[i]], numberofinstance[i]))
end
julia expand
julia expand
asked Jan 2 at 18:17
fsmartfsmart
1,27321738
1,27321738
I found the function in StatsBase.jl. See my updated answer.
– crstnbr
Jan 2 at 19:22
add a comment |
I found the function in StatsBase.jl. See my updated answer.
– crstnbr
Jan 2 at 19:22
I found the function in StatsBase.jl. See my updated answer.
– crstnbr
Jan 2 at 19:22
I found the function in StatsBase.jl. See my updated answer.
– crstnbr
Jan 2 at 19:22
add a comment |
1 Answer
1
active
oldest
votes
If you are fine with using a package (basically a stdlib), the function you are looking for is called inverse_rle
in StatsBase.jl:
julia> using StatsBase
julia> inverse_rle(valuelist, numberofinstance)
20-element Array{String,1}:
"a"
"a"
"a"
"b"
"b"
"b"
"b"
"b"
"d"
"z"
"z"
"z"
"z"
"z"
"z"
"z"
"z"
"z"
"z"
"z"
julia> @btime inverse_rle($valuelist, $numberofinstance);
76.799 ns (1 allocation: 240 bytes)
julia> @btime yoursolution($valuelist, $numberofinstance);
693.329 ns (13 allocations: 1.55 KiB)
If you want to avoid packages, you could, in principle, broadcast repeat
or ^
(powering) like so,
vcat(collect.(.^(valuelist, numberofinstance))...)
but I'd argue that this is relatively hard to parse and also slower than inverse_rle
,
julia> @btime yoursolution($valuelist, $numberofinstance);
693.329 ns (13 allocations: 1.55 KiB)
julia> @btime vcat(collect.(.^($valuelist, $numberofinstance))...)
472.615 ns (9 allocations: 800 bytes)
However, since Julia allows you to write fast loops you can easily define your own simple function. The following is much faster than your solution (as fast as the implementation in StatsBase
):
function multiply(vs, ns)
r = Vector{String}(undef, sum(ns))
c = 1
@inbounds for i in axes(ns, 1)
for k in 1:ns[i]
r[c] = vs[i]
c += 1
end
end
r
end
Benchmark:
julia> @btime yoursolution($valuelist, $numberofinstance);
693.329 ns (13 allocations: 1.55 KiB)
julia> @btime multiply($valuelist, $numberofinstance);
76.469 ns (1 allocation: 240 bytes)
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54011242%2fexpanding-vector-list-each-by-list-of-instances-julia%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
If you are fine with using a package (basically a stdlib), the function you are looking for is called inverse_rle
in StatsBase.jl:
julia> using StatsBase
julia> inverse_rle(valuelist, numberofinstance)
20-element Array{String,1}:
"a"
"a"
"a"
"b"
"b"
"b"
"b"
"b"
"d"
"z"
"z"
"z"
"z"
"z"
"z"
"z"
"z"
"z"
"z"
"z"
julia> @btime inverse_rle($valuelist, $numberofinstance);
76.799 ns (1 allocation: 240 bytes)
julia> @btime yoursolution($valuelist, $numberofinstance);
693.329 ns (13 allocations: 1.55 KiB)
If you want to avoid packages, you could, in principle, broadcast repeat
or ^
(powering) like so,
vcat(collect.(.^(valuelist, numberofinstance))...)
but I'd argue that this is relatively hard to parse and also slower than inverse_rle
,
julia> @btime yoursolution($valuelist, $numberofinstance);
693.329 ns (13 allocations: 1.55 KiB)
julia> @btime vcat(collect.(.^($valuelist, $numberofinstance))...)
472.615 ns (9 allocations: 800 bytes)
However, since Julia allows you to write fast loops you can easily define your own simple function. The following is much faster than your solution (as fast as the implementation in StatsBase
):
function multiply(vs, ns)
r = Vector{String}(undef, sum(ns))
c = 1
@inbounds for i in axes(ns, 1)
for k in 1:ns[i]
r[c] = vs[i]
c += 1
end
end
r
end
Benchmark:
julia> @btime yoursolution($valuelist, $numberofinstance);
693.329 ns (13 allocations: 1.55 KiB)
julia> @btime multiply($valuelist, $numberofinstance);
76.469 ns (1 allocation: 240 bytes)
add a comment |
If you are fine with using a package (basically a stdlib), the function you are looking for is called inverse_rle
in StatsBase.jl:
julia> using StatsBase
julia> inverse_rle(valuelist, numberofinstance)
20-element Array{String,1}:
"a"
"a"
"a"
"b"
"b"
"b"
"b"
"b"
"d"
"z"
"z"
"z"
"z"
"z"
"z"
"z"
"z"
"z"
"z"
"z"
julia> @btime inverse_rle($valuelist, $numberofinstance);
76.799 ns (1 allocation: 240 bytes)
julia> @btime yoursolution($valuelist, $numberofinstance);
693.329 ns (13 allocations: 1.55 KiB)
If you want to avoid packages, you could, in principle, broadcast repeat
or ^
(powering) like so,
vcat(collect.(.^(valuelist, numberofinstance))...)
but I'd argue that this is relatively hard to parse and also slower than inverse_rle
,
julia> @btime yoursolution($valuelist, $numberofinstance);
693.329 ns (13 allocations: 1.55 KiB)
julia> @btime vcat(collect.(.^($valuelist, $numberofinstance))...)
472.615 ns (9 allocations: 800 bytes)
However, since Julia allows you to write fast loops you can easily define your own simple function. The following is much faster than your solution (as fast as the implementation in StatsBase
):
function multiply(vs, ns)
r = Vector{String}(undef, sum(ns))
c = 1
@inbounds for i in axes(ns, 1)
for k in 1:ns[i]
r[c] = vs[i]
c += 1
end
end
r
end
Benchmark:
julia> @btime yoursolution($valuelist, $numberofinstance);
693.329 ns (13 allocations: 1.55 KiB)
julia> @btime multiply($valuelist, $numberofinstance);
76.469 ns (1 allocation: 240 bytes)
add a comment |
If you are fine with using a package (basically a stdlib), the function you are looking for is called inverse_rle
in StatsBase.jl:
julia> using StatsBase
julia> inverse_rle(valuelist, numberofinstance)
20-element Array{String,1}:
"a"
"a"
"a"
"b"
"b"
"b"
"b"
"b"
"d"
"z"
"z"
"z"
"z"
"z"
"z"
"z"
"z"
"z"
"z"
"z"
julia> @btime inverse_rle($valuelist, $numberofinstance);
76.799 ns (1 allocation: 240 bytes)
julia> @btime yoursolution($valuelist, $numberofinstance);
693.329 ns (13 allocations: 1.55 KiB)
If you want to avoid packages, you could, in principle, broadcast repeat
or ^
(powering) like so,
vcat(collect.(.^(valuelist, numberofinstance))...)
but I'd argue that this is relatively hard to parse and also slower than inverse_rle
,
julia> @btime yoursolution($valuelist, $numberofinstance);
693.329 ns (13 allocations: 1.55 KiB)
julia> @btime vcat(collect.(.^($valuelist, $numberofinstance))...)
472.615 ns (9 allocations: 800 bytes)
However, since Julia allows you to write fast loops you can easily define your own simple function. The following is much faster than your solution (as fast as the implementation in StatsBase
):
function multiply(vs, ns)
r = Vector{String}(undef, sum(ns))
c = 1
@inbounds for i in axes(ns, 1)
for k in 1:ns[i]
r[c] = vs[i]
c += 1
end
end
r
end
Benchmark:
julia> @btime yoursolution($valuelist, $numberofinstance);
693.329 ns (13 allocations: 1.55 KiB)
julia> @btime multiply($valuelist, $numberofinstance);
76.469 ns (1 allocation: 240 bytes)
If you are fine with using a package (basically a stdlib), the function you are looking for is called inverse_rle
in StatsBase.jl:
julia> using StatsBase
julia> inverse_rle(valuelist, numberofinstance)
20-element Array{String,1}:
"a"
"a"
"a"
"b"
"b"
"b"
"b"
"b"
"d"
"z"
"z"
"z"
"z"
"z"
"z"
"z"
"z"
"z"
"z"
"z"
julia> @btime inverse_rle($valuelist, $numberofinstance);
76.799 ns (1 allocation: 240 bytes)
julia> @btime yoursolution($valuelist, $numberofinstance);
693.329 ns (13 allocations: 1.55 KiB)
If you want to avoid packages, you could, in principle, broadcast repeat
or ^
(powering) like so,
vcat(collect.(.^(valuelist, numberofinstance))...)
but I'd argue that this is relatively hard to parse and also slower than inverse_rle
,
julia> @btime yoursolution($valuelist, $numberofinstance);
693.329 ns (13 allocations: 1.55 KiB)
julia> @btime vcat(collect.(.^($valuelist, $numberofinstance))...)
472.615 ns (9 allocations: 800 bytes)
However, since Julia allows you to write fast loops you can easily define your own simple function. The following is much faster than your solution (as fast as the implementation in StatsBase
):
function multiply(vs, ns)
r = Vector{String}(undef, sum(ns))
c = 1
@inbounds for i in axes(ns, 1)
for k in 1:ns[i]
r[c] = vs[i]
c += 1
end
end
r
end
Benchmark:
julia> @btime yoursolution($valuelist, $numberofinstance);
693.329 ns (13 allocations: 1.55 KiB)
julia> @btime multiply($valuelist, $numberofinstance);
76.469 ns (1 allocation: 240 bytes)
edited Jan 2 at 19:24
answered Jan 2 at 19:02
crstnbrcrstnbr
4,46811124
4,46811124
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54011242%2fexpanding-vector-list-each-by-list-of-instances-julia%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
I found the function in StatsBase.jl. See my updated answer.
– crstnbr
Jan 2 at 19:22