Vectorized indexing for a dictionary2019 Community Moderator ElectionNested list comprehensions in JuliaJulia storing a partitioned data frame to a dictionaryAvoid memory allocation when indexing an array in Juliamap, reduce with `|>` in juliaMultiple selection from Julia arrayNested array comprehension in JuliaJulia - using dictionary key as index for a multidimensional arrayConvert Dict to ArrayTuple in JuliaHow to access key-value tuples in forward/reverse order for Dict and SortedDict? - Juliaboolean matching using & operator
Having the player face themselves after the mid-game
What would be the most expensive material to an intergalactic society?
What do you call someone who likes to pick fights?
Proving a statement about real numbers
After `ssh` without `-X` to a machine, is it possible to change `$DISPLAY` to make it work like `ssh -X`?
Street obstacles in New Zealand
Why do we say ‘pairwise disjoint’, rather than ‘disjoint’?
Does a difference of tense count as a difference of meaning in a minimal pair?
Why aren't there more Gauls like Obelix?
School performs periodic password audits. Is my password compromised?
Making a kiddush for a girl that has hard time finding shidduch
Can we track matter through time by looking at different depths in space?
Finitely many repeated replacements
Is it possible to avoid unpacking when merging Association?
Can't make sense of a paragraph from Lovecraft
Which situations would cause a company to ground or recall a aircraft series?
Does an unused member variable take up memory?
I need help with tikz tree node and label, offsets and inclination
What materials can be used to make a humanoid skin warm?
What is this diamond of every day?
Is it possible to find 2014 distinct positive integers whose sum is divisible by each of them?
Would an aboleth's Phantasmal Force lair action be affected by Counterspell, Dispel Magic, and/or Slow?
Outlet with 3 sets of wires
PTIJ: Why does only a Shor Tam ask at the Seder, and not a Shor Mu'ad?
Vectorized indexing for a dictionary
2019 Community Moderator ElectionNested list comprehensions in JuliaJulia storing a partitioned data frame to a dictionaryAvoid memory allocation when indexing an array in Juliamap, reduce with `|>` in juliaMultiple selection from Julia arrayNested array comprehension in JuliaJulia - using dictionary key as index for a multidimensional arrayConvert Dict to ArrayTuple in JuliaHow to access key-value tuples in forward/reverse order for Dict and SortedDict? - Juliaboolean matching using & operator
I would like to find a succinct syntax in Julia for indexing a dictionary in a vectorized manner. In R, I would do the following:
dict <- c("a" = 1, "b" = 2)
keys <- c("a", "a", "b", "b", "a")
dict[keys]
In Julia, if I have a dict
and keys
like this,
dict = Dict(:a => 1, :b => 2)
keys = [:a, :a, :b, :b, :a]
then I can achieve the desired result using a list comprehension:
julia> [dict[key] for key in keys]
5-element ArrayInt64,1:
1
1
2
2
1
Is there a more succinct vectorized syntax, similar to the R syntax?
julia
add a comment |
I would like to find a succinct syntax in Julia for indexing a dictionary in a vectorized manner. In R, I would do the following:
dict <- c("a" = 1, "b" = 2)
keys <- c("a", "a", "b", "b", "a")
dict[keys]
In Julia, if I have a dict
and keys
like this,
dict = Dict(:a => 1, :b => 2)
keys = [:a, :a, :b, :b, :a]
then I can achieve the desired result using a list comprehension:
julia> [dict[key] for key in keys]
5-element ArrayInt64,1:
1
1
2
2
1
Is there a more succinct vectorized syntax, similar to the R syntax?
julia
add a comment |
I would like to find a succinct syntax in Julia for indexing a dictionary in a vectorized manner. In R, I would do the following:
dict <- c("a" = 1, "b" = 2)
keys <- c("a", "a", "b", "b", "a")
dict[keys]
In Julia, if I have a dict
and keys
like this,
dict = Dict(:a => 1, :b => 2)
keys = [:a, :a, :b, :b, :a]
then I can achieve the desired result using a list comprehension:
julia> [dict[key] for key in keys]
5-element ArrayInt64,1:
1
1
2
2
1
Is there a more succinct vectorized syntax, similar to the R syntax?
julia
I would like to find a succinct syntax in Julia for indexing a dictionary in a vectorized manner. In R, I would do the following:
dict <- c("a" = 1, "b" = 2)
keys <- c("a", "a", "b", "b", "a")
dict[keys]
In Julia, if I have a dict
and keys
like this,
dict = Dict(:a => 1, :b => 2)
keys = [:a, :a, :b, :b, :a]
then I can achieve the desired result using a list comprehension:
julia> [dict[key] for key in keys]
5-element ArrayInt64,1:
1
1
2
2
1
Is there a more succinct vectorized syntax, similar to the R syntax?
julia
julia
asked Mar 7 at 1:38
clbieganekclbieganek
714412
714412
add a comment |
add a comment |
4 Answers
4
active
oldest
votes
getindex.(Ref(dict), keys)
You can wrap it in Ref
so you don't need to []
it.
add a comment |
Here's a little macro (using the brilliant MacroTools package):
using MacroTools
macro vget(ex)
@capture(ex, dict_.[idxvec_])
:(map(i->$dict[i], $idxvec)) |> esc
end
Then you can:
d = Dict(:a => 1, :b => 2)
ks = [:a, :a, :b, :b, :a]
@vget d.[ks]
I probably wouldn't want to use that in production code, something like your list comprehension, or a simple map: map(i->d[i], ks)
, is more readable/explicit/standard, but it is fun :D
add a comment |
If you're going to be frequently using the dictionary as a lookup table, then it might be worth creating a closure to use as a lookup function:
make_lookup(dict) = key -> dict[key]
dict = Dict(:a => 1, :b => 2)
lookup = make_lookup(dict)
Then you can use lookup
in a vectorized fashion:
julia> keys = [:a, :a, :b, :b, :a];
julia> lookup.(keys)
5-element ArrayInt64,1:
1
1
2
2
1
add a comment |
You can use the vectorized version of getindex
:
julia> getindex.([dict], keys)
5-element ArrayInt64,1:
1
1
2
2
1
Note that dict
is wrapped in an array so that getindex
does not attempt to broadcast over the elements of the dictionary:
julia> getindex.(dict, keys)
ERROR: ArgumentError: broadcasting over dictionaries and `NamedTuple`s is reserved
Stacktrace:
[1] broadcastable(::DictSymbol,Int64) at ./broadcast.jl:615
[2] broadcasted(::Function, ::DictSymbol,Int64, ::ArraySymbol,1) at ./broadcast.jl:1164
[3] top-level scope at none:0
2
I think it's preferable to usegetindex.((dict,), keys)
orgetindex.(Ref(dict), keys)
, since[dict]
will allocate an array.
– DNF
Mar 7 at 9:59
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%2f55034758%2fvectorized-indexing-for-a-dictionary%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
4 Answers
4
active
oldest
votes
4 Answers
4
active
oldest
votes
active
oldest
votes
active
oldest
votes
getindex.(Ref(dict), keys)
You can wrap it in Ref
so you don't need to []
it.
add a comment |
getindex.(Ref(dict), keys)
You can wrap it in Ref
so you don't need to []
it.
add a comment |
getindex.(Ref(dict), keys)
You can wrap it in Ref
so you don't need to []
it.
getindex.(Ref(dict), keys)
You can wrap it in Ref
so you don't need to []
it.
answered Mar 7 at 4:37
xiaodaixiaodai
4,176114871
4,176114871
add a comment |
add a comment |
Here's a little macro (using the brilliant MacroTools package):
using MacroTools
macro vget(ex)
@capture(ex, dict_.[idxvec_])
:(map(i->$dict[i], $idxvec)) |> esc
end
Then you can:
d = Dict(:a => 1, :b => 2)
ks = [:a, :a, :b, :b, :a]
@vget d.[ks]
I probably wouldn't want to use that in production code, something like your list comprehension, or a simple map: map(i->d[i], ks)
, is more readable/explicit/standard, but it is fun :D
add a comment |
Here's a little macro (using the brilliant MacroTools package):
using MacroTools
macro vget(ex)
@capture(ex, dict_.[idxvec_])
:(map(i->$dict[i], $idxvec)) |> esc
end
Then you can:
d = Dict(:a => 1, :b => 2)
ks = [:a, :a, :b, :b, :a]
@vget d.[ks]
I probably wouldn't want to use that in production code, something like your list comprehension, or a simple map: map(i->d[i], ks)
, is more readable/explicit/standard, but it is fun :D
add a comment |
Here's a little macro (using the brilliant MacroTools package):
using MacroTools
macro vget(ex)
@capture(ex, dict_.[idxvec_])
:(map(i->$dict[i], $idxvec)) |> esc
end
Then you can:
d = Dict(:a => 1, :b => 2)
ks = [:a, :a, :b, :b, :a]
@vget d.[ks]
I probably wouldn't want to use that in production code, something like your list comprehension, or a simple map: map(i->d[i], ks)
, is more readable/explicit/standard, but it is fun :D
Here's a little macro (using the brilliant MacroTools package):
using MacroTools
macro vget(ex)
@capture(ex, dict_.[idxvec_])
:(map(i->$dict[i], $idxvec)) |> esc
end
Then you can:
d = Dict(:a => 1, :b => 2)
ks = [:a, :a, :b, :b, :a]
@vget d.[ks]
I probably wouldn't want to use that in production code, something like your list comprehension, or a simple map: map(i->d[i], ks)
, is more readable/explicit/standard, but it is fun :D
answered Mar 7 at 5:04
JobJobJobJob
2,4392328
2,4392328
add a comment |
add a comment |
If you're going to be frequently using the dictionary as a lookup table, then it might be worth creating a closure to use as a lookup function:
make_lookup(dict) = key -> dict[key]
dict = Dict(:a => 1, :b => 2)
lookup = make_lookup(dict)
Then you can use lookup
in a vectorized fashion:
julia> keys = [:a, :a, :b, :b, :a];
julia> lookup.(keys)
5-element ArrayInt64,1:
1
1
2
2
1
add a comment |
If you're going to be frequently using the dictionary as a lookup table, then it might be worth creating a closure to use as a lookup function:
make_lookup(dict) = key -> dict[key]
dict = Dict(:a => 1, :b => 2)
lookup = make_lookup(dict)
Then you can use lookup
in a vectorized fashion:
julia> keys = [:a, :a, :b, :b, :a];
julia> lookup.(keys)
5-element ArrayInt64,1:
1
1
2
2
1
add a comment |
If you're going to be frequently using the dictionary as a lookup table, then it might be worth creating a closure to use as a lookup function:
make_lookup(dict) = key -> dict[key]
dict = Dict(:a => 1, :b => 2)
lookup = make_lookup(dict)
Then you can use lookup
in a vectorized fashion:
julia> keys = [:a, :a, :b, :b, :a];
julia> lookup.(keys)
5-element ArrayInt64,1:
1
1
2
2
1
If you're going to be frequently using the dictionary as a lookup table, then it might be worth creating a closure to use as a lookup function:
make_lookup(dict) = key -> dict[key]
dict = Dict(:a => 1, :b => 2)
lookup = make_lookup(dict)
Then you can use lookup
in a vectorized fashion:
julia> keys = [:a, :a, :b, :b, :a];
julia> lookup.(keys)
5-element ArrayInt64,1:
1
1
2
2
1
edited 2 days ago
answered Mar 7 at 21:16
clbieganekclbieganek
714412
714412
add a comment |
add a comment |
You can use the vectorized version of getindex
:
julia> getindex.([dict], keys)
5-element ArrayInt64,1:
1
1
2
2
1
Note that dict
is wrapped in an array so that getindex
does not attempt to broadcast over the elements of the dictionary:
julia> getindex.(dict, keys)
ERROR: ArgumentError: broadcasting over dictionaries and `NamedTuple`s is reserved
Stacktrace:
[1] broadcastable(::DictSymbol,Int64) at ./broadcast.jl:615
[2] broadcasted(::Function, ::DictSymbol,Int64, ::ArraySymbol,1) at ./broadcast.jl:1164
[3] top-level scope at none:0
2
I think it's preferable to usegetindex.((dict,), keys)
orgetindex.(Ref(dict), keys)
, since[dict]
will allocate an array.
– DNF
Mar 7 at 9:59
add a comment |
You can use the vectorized version of getindex
:
julia> getindex.([dict], keys)
5-element ArrayInt64,1:
1
1
2
2
1
Note that dict
is wrapped in an array so that getindex
does not attempt to broadcast over the elements of the dictionary:
julia> getindex.(dict, keys)
ERROR: ArgumentError: broadcasting over dictionaries and `NamedTuple`s is reserved
Stacktrace:
[1] broadcastable(::DictSymbol,Int64) at ./broadcast.jl:615
[2] broadcasted(::Function, ::DictSymbol,Int64, ::ArraySymbol,1) at ./broadcast.jl:1164
[3] top-level scope at none:0
2
I think it's preferable to usegetindex.((dict,), keys)
orgetindex.(Ref(dict), keys)
, since[dict]
will allocate an array.
– DNF
Mar 7 at 9:59
add a comment |
You can use the vectorized version of getindex
:
julia> getindex.([dict], keys)
5-element ArrayInt64,1:
1
1
2
2
1
Note that dict
is wrapped in an array so that getindex
does not attempt to broadcast over the elements of the dictionary:
julia> getindex.(dict, keys)
ERROR: ArgumentError: broadcasting over dictionaries and `NamedTuple`s is reserved
Stacktrace:
[1] broadcastable(::DictSymbol,Int64) at ./broadcast.jl:615
[2] broadcasted(::Function, ::DictSymbol,Int64, ::ArraySymbol,1) at ./broadcast.jl:1164
[3] top-level scope at none:0
You can use the vectorized version of getindex
:
julia> getindex.([dict], keys)
5-element ArrayInt64,1:
1
1
2
2
1
Note that dict
is wrapped in an array so that getindex
does not attempt to broadcast over the elements of the dictionary:
julia> getindex.(dict, keys)
ERROR: ArgumentError: broadcasting over dictionaries and `NamedTuple`s is reserved
Stacktrace:
[1] broadcastable(::DictSymbol,Int64) at ./broadcast.jl:615
[2] broadcasted(::Function, ::DictSymbol,Int64, ::ArraySymbol,1) at ./broadcast.jl:1164
[3] top-level scope at none:0
answered Mar 7 at 1:38
clbieganekclbieganek
714412
714412
2
I think it's preferable to usegetindex.((dict,), keys)
orgetindex.(Ref(dict), keys)
, since[dict]
will allocate an array.
– DNF
Mar 7 at 9:59
add a comment |
2
I think it's preferable to usegetindex.((dict,), keys)
orgetindex.(Ref(dict), keys)
, since[dict]
will allocate an array.
– DNF
Mar 7 at 9:59
2
2
I think it's preferable to use
getindex.((dict,), keys)
or getindex.(Ref(dict), keys)
, since [dict]
will allocate an array.– DNF
Mar 7 at 9:59
I think it's preferable to use
getindex.((dict,), keys)
or getindex.(Ref(dict), keys)
, since [dict]
will allocate an array.– DNF
Mar 7 at 9:59
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%2f55034758%2fvectorized-indexing-for-a-dictionary%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