2015-08-26 70 views
2

我試圖瞭解爲什麼會發生這種情況,即使DataArrays存在限制。假設你想在映射的Int64s一個DataArray中:爲什麼在DataArrays上操作時地圖會丟棄類型信息?

da = DataArray([1,2,3,4]) 
println(typeof(da)) 
println(typeof(map(a -> a^2, da))) # Returns an int for this input 
println(typeof(map(a -> int(a^2), da))) # Cast the piecewise result to int 
println(typeof(int(map(a -> a^2, da)))) # Cast the output DataArray{Any,1} to int 

導致

DataArray{Int64,1} 
DataArray{Any,1} 
DataArray{Any,1} 
Array{Int64,1} 

對於數組,a = [1,2,3,4],如預期map(a -> a^2, da)返回Int64s數組。在這裏導致類型信息丟失的map和/或DataArrays是什麼? 當您使用的類型沒有將DataArray {Any,1}轉換爲DataArray {ThatType,1}類似Dates.DateTime的構造函數時,是否有解決方案來保存類型信息?

編輯:轉換工作正常,使DataArray {Any,1}一個DataArray {ThatType,1}(以及至少爲DateTime)。

回答

2
@which map(a -> a^2, da::DataArray{Int64, 1}) 
map(f::Function,dv::DataArray{T,1}) at /home/omer/.julia/v0.3/DataArrays/src/datavector.jl:114 

檢查來源;
https://github.com/JuliaStats/DataArrays.jl/blob/master/src/datavector.jl

# TODO: should this be an AbstractDataVector, so it works with PDV's? 
function Base.map(f::Function, dv::DataVector) 
    n = length(dv) 
    res = DataArray(Any, n) 
    for i in 1:n 
     res[i] = f(dv[i]) 
    end 
    return res 
end 

它創造型DataArray中的任何{1}返回。

res = DataArray(Any, n) 

您可以檢查由詹姆斯·費爾班克斯(4月1日04:12 2015年)
http://blog.gmane.org/gmane.comp.lang.julia.user/month=20150401

+0

優秀的抓給出了答案,我忘了地圖!這是我應該使用的。 – ARM

相關問題