朱莉娅列表理解改变了类型

时间:2015-07-23 23:53:22

标签: julia

假设我们在julia中有Vector个元组(Int64, Int64)

In [1] xx = [(1, 2), (3, 4), (5, 6)]
       typeof(xx) == Vector{(Int64, Int64)}
Out[1] true

现在我想构建一个元组的第一个索引的新向量。

In [2] indices = [x[1] for x in xx]
       typeof(indices)
Out[2] Array{Any, 1}

我希望它是Array{Int64, 1}类型。我该如何解决这个问题?

编辑:我使用的是0.3.9。

2 个答案:

答案 0 :(得分:10)

function f()
    xx = [(1, 2), (3, 4), (5, 6)]
    inds = [ x[1] for x in xx ]
    return(inds)
end

y = f()
typeof(y)

最后一行代码返回Array{Int64, 1}

这里的问题是您在全球范围内工作。对于Julia的类型推断能够发挥其魔力,您需要在本地范围内工作。换句话说,将所有代码包装在函数中。这个规则是非常非常重要的,但是,我自己来自MatLab背景,我可以看到为什么人们会忘记它。请记住,90%的问题都说“为什么我的朱莉娅代码会变慢?”之所以发生是因为用户在全局范围内工作,而不是在本地范围内工作。

ps,即使在局部范围内,循环理解的类型推断也会在特别复杂的情况下发生。这是一个已知问题,正在进行中。如果您想为编译器提供一些“帮助”,您可以执行以下操作:

inds = Int[ x[1] for x in xx ]

答案 1 :(得分:0)

您也可以使用map并保留类型:

#passing a lambda that takes the 1st element, and the iterable
inds = map( (x)-> x[1], xx)