Julia 列表理解改变了类型
Julia list comprehension changes the type
假设我们在 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。
function f()
xx = [(1, 2), (3, 4), (5, 6)]
inds = [ x[1] for x in xx ]
return(inds)
end
y = f()
typeof(y)
最后一行代码returnsArray{Int64, 1}
.
这里的问题是您在全球范围内工作。要让 Julia 的类型推断发挥它的魔力,您需要在本地范围内工作。换句话说,将所有代码包装在函数中。这条规则非常、非常、重要,但是,我自己有 MatLab 背景,所以我明白为什么人们会忘记它。请记住,90% 的问题说 "Why is my Julia code slow?" 是因为用户在全球范围内工作,而不是本地范围。
ps,即使在局部范围内,循环理解的类型推断也会在特别复杂的情况下出错。这是一个已知问题,正在处理中。如果你想为编译器提供一些 "help" 你可以这样做:
inds = Int[ x[1] for x in xx ]
您也可以使用 map
并保留类型:
#passing a lambda that takes the 1st element, and the iterable
inds = map( (x)-> x[1], xx)
假设我们在 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。
function f()
xx = [(1, 2), (3, 4), (5, 6)]
inds = [ x[1] for x in xx ]
return(inds)
end
y = f()
typeof(y)
最后一行代码returnsArray{Int64, 1}
.
这里的问题是您在全球范围内工作。要让 Julia 的类型推断发挥它的魔力,您需要在本地范围内工作。换句话说,将所有代码包装在函数中。这条规则非常、非常、重要,但是,我自己有 MatLab 背景,所以我明白为什么人们会忘记它。请记住,90% 的问题说 "Why is my Julia code slow?" 是因为用户在全球范围内工作,而不是本地范围。
ps,即使在局部范围内,循环理解的类型推断也会在特别复杂的情况下出错。这是一个已知问题,正在处理中。如果你想为编译器提供一些 "help" 你可以这样做:
inds = Int[ x[1] for x in xx ]
您也可以使用 map
并保留类型:
#passing a lambda that takes the 1st element, and the iterable
inds = map( (x)-> x[1], xx)