【问题标题】:Create array of values based on dictionary and array of keys根据字典和键数组创建值数组
【发布时间】:2019-09-19 02:09:13
【问题描述】:

我是 Julia 的新手,如果这是一个基本问题,我很抱歉。

假设我们有一个字典和一个键向量:

X = [2, 1, 1, 3]
d = Dict( 1 => "A", 2 => "B", 3 => "C")

我想创建一个包含值而不是键的新数组(根据字典),所以最终结果将类似于

Y = ["B", "A", "A", "C"]

我想我可以遍历向量元素,在字典中查找它并返回相应的值,但这对我来说似乎非常低效。 类似的东西

Y = Array{String}(undef, length(X))
for i in 1:length(X)
    Y[i] = d[X[i]]
end

编辑:另外,如果 X 包含 missing 值,我提出的解决方案将不起作用。

所以我的问题是,是否有更有效的方法(我正在使用更大的数组和字典),或者这是一种合适的方法吗?

【问题讨论】:

  • 您自己的建议非常高效,并且可能是最快的解决方案。 Julia 中的循环非常快,通常是最佳解决方案。请注意,您可以使用Chars 代替长度为1 的字符串,例如'A',这样更快。
  • @DNF 谢谢!我不知道Chars。我想我剩下的唯一问题与我的编辑有关:当X 具有missing 值时,这可以适应工作吗?如果我实现这个,我会告诉KeyError: key missing not found
  • 我为此编辑了下面的答案。
  • 有几个很好的解决方案,有些很简洁,有些很冗长,但这里重要的一点是循环很快,你不一定需要去寻找罐头“内置”在'解决方案。你自己的循环代码会很快。这需要一些时间来学习 Matlabbers、Pythonistas 和 R 用户 ;)

标签: julia


【解决方案1】:

效率在不同情况下可能意味着不同的东西,但我可能会这样做:

Y = [d[i] for i in X]

如果X 包含missing 值,您可以在理解中使用skipmissing(X)

【讨论】:

  • 太棒了!它可以适应处理X 中的missing 值吗? (我编辑了问题)。
  • skipmissing(X) 有效,但 Y 的长度与 X 的长度不同。但是,我发现在字典中为 missing 添加键值对允许我使用您提出的解决方案并将缺失值保留在 Y:d = Dict{Union{Integer, Missing}, Union{String, Missing}}( 1 => "A", 2 => "B", 3 => "C", missing => missing)
  • 据我所知,[d[i] for i in skipmissing(X)] 适用于一般情况,不需要字典中的任何额外 keyval 对。或者,您真的需要它们的长度相等吗?
  • 是的,你是对的。但我需要保留缺失值的条目(所以是的,长度相同)。
【解决方案2】:

您可以使用数组推导非常简洁地做到这一点:

julia> [d[x] for x in X]
4-element Array{String,1}:
 "B"
 "A"
 "A"
 "C"

将来可能会写d.[X] 来更简洁地表达这一点,但从 Julia 1.3 开始,还不允许这样做。

根据对问题的编辑,假设X 中某处有一个missing 值:

julia> X = [2, 1, missing, 1, 3]
5-element Array{Union{Missing, Int64},1}:
 2
 1
  missing
 1
 3

如果您想将missing 映射到missing 或字符串"?" 之类的其他值,您可以像这样明确地执行此操作:

julia> [ismissing(x) ? missing : d[x] for x in X]
5-element Array{Union{Missing, String},1}:
 "B"
 "A"
 missing
 "A"
 "C"

julia> [ismissing(x) ? "?" : d[x] for x in X]
5-element Array{String,1}:
 "B"
 "A"
 "?"
 "A"
 "C"

如果您要经常这样做,将missing 放入字典中可能会更容易,如下所示:

julia> d = Dict(missing => "?", 1 => "A", 2 => "B", 3 => "C")
Dict{Union{Missing, Int64},String} with 4 entries:
  2       => "B"
  missing => "?"
  3       => "C"
  1       => "A"

julia> [d[x] for x in X]
5-element Array{String,1}:
 "B"
 "A"
 "?"
 "A"
 "C"

如果您想简单地跳过缺失值,可以使用skipmissing(X) 而不是X

julia> [d[x] for x in skipmissing(X)]
4-element Array{String,1}:
 "B"
 "A"
 "A"
 "C"

通常没有一种正确的方法来处理缺失值,这就是为什么您需要明确编码如何处理缺失数据的原因。

【讨论】:

  • 如果X 包含missing 怎么办? (见上面的cmets)
猜你喜欢
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-05
  • 2015-04-11
  • 1970-01-01
  • 2017-10-22
  • 2022-09-28
相关资源
最近更新 更多