将一维对象数组(复合类型)转换为二维数组

时间:2016-09-18 17:02:17

标签: arrays julia

我已定义了类似

的复合类型
type Position
  Date::DateTime
  x::AbstractFloat
  y::AbstractFloat
  z::AbstractFloat
end

和数组1维对象数组(复合类型)定义如下

arr = [Position(DateTime(2016,1,1,10,00,00),0,0,0),
   Position(DateTime(2016,1,1,10,00,01),2,0,0),
   Position(DateTime(2016,1,1,10,00,02),2,1,0),
   Position(DateTime(2016,1,1,10,00,03),2,2,0),
   ]

我可以使用

轻松获取a_Dates(日期数组)
a_Dates = map(rec->rec.Date, arr)

但我不知道如何获得二维位置数组(x,y,z)

理想情况下,我想要一个没有for循环的解决方案。 为此,我知道我可以做(例如)

Nrows, Ncols = length(arr), length(fieldnames(Position)) - 1
data = zeros(Nrows, Ncols)

for i in 1:Nrows
    for j in 1:Ncols
        data[i, j] = getfield(arr[i], j + 1)
    end
end

2 个答案:

答案 0 :(得分:1)

阵列

new_array = map(rec->[rec.x, rec.y, rec.z], arr)

<强>另外

new_array = vcat(new_array)
new_array = reshape(new_array,convert(Int64, length(new_array)/3),3)

new_array = reshape(new_array,length(arr),3)

答案 1 :(得分:1)

[getfield(p, f) for p in arr, f in (:x, :y, :z)]您要找的是什么?

(在julia 0.4中,这将给出Array{Any},但在这种情况下,您可以只使用前缀Float64来获取正确的类型。)