IDL - 数组结构到结构数组
IDL - Struct of Arrays to Array of Structs
我从 FITS-Table 读取数据,并得到一个包含 table 的结构,其中每个标签代表一列。
有没有办法将数组结构重新格式化为结构数组?
那么Array中的一个Struct代表一个Row?
@mgalloy 提出的一般解决方案(见下文):
function SoA2AoS, table
if (table eq !NULL) then return, !NULL
tnames = tag_names(table)
new_table = create_struct(tnames[0], (table.(0)[0]))
for t = 1L, n_tags(table) - 1L do begin
new_table = create_struct(new_table, tnames[t], (table.(t))[0])
endfor
new_table = replicate(new_table, n_elements(table.(0)))
for t = 0L, n_tags(table) - 1L do begin
new_table.(t) = table.(t)
endfor
return, new_table
end
是的,所以你有这样的东西?
IDL> table = { a: findgen(10), b: 2. * findgen(10) }
创建一个新的 table,定义单行的外观并将其复制适当的次数:
IDL> new_table = replicate({a: 0.0, b: 0.0}, 10)
然后将列复制过来:
IDL> new_table.a = table.a
IDL> new_table.b = table.b
您的新 table 可以按行或列访问:
IDL> print, new_table[5]
{ 5.00000 10.0000}
IDL> print, new_table.a
0.00000 1.00000 2.00000 3.00000 4.00000 5.00000 6.00000
7.00000 8.00000 9.00000
你也可以在不知道标签名称的情况下执行此操作(未经测试的代码):
; suppose table is a structure containing arrays
tnames = tag_names(table)
new_table = create_struct(tnames[0], (table.(0))[0]
for t = 1L, n_tags(table) - 1L do begin
new_table = create_struct(new_table, tnames[t], (table.(t))[0])
endfor
table = replicate(table, n_elements(table.(0)))
for t = 0L, n_tags(table) - 1L do begin
new_table.(t) = table.(t)
endfor
mgalloy 的解决方案也帮助了我。由于无法添加评论,我已经用修复程序更新了他的代码。
; suppose table is a structure containing arrays
tnames = tag_names(table)
new_table = create_struct(tnames[0], (table.(0))[0])
for t = 1L, n_tags(table) - 1L do begin
new_table = create_struct(new_table, tnames[t], (table.(t))[0])
endfor
new_table = replicate(new_table, n_elements(table.(0)))
for t = 0L, n_tags(table) - 1L do begin
new_table.(t) = table.(t)
endfor
我从 FITS-Table 读取数据,并得到一个包含 table 的结构,其中每个标签代表一列。
有没有办法将数组结构重新格式化为结构数组? 那么Array中的一个Struct代表一个Row?
@mgalloy 提出的一般解决方案(见下文):
function SoA2AoS, table
if (table eq !NULL) then return, !NULL
tnames = tag_names(table)
new_table = create_struct(tnames[0], (table.(0)[0]))
for t = 1L, n_tags(table) - 1L do begin
new_table = create_struct(new_table, tnames[t], (table.(t))[0])
endfor
new_table = replicate(new_table, n_elements(table.(0)))
for t = 0L, n_tags(table) - 1L do begin
new_table.(t) = table.(t)
endfor
return, new_table
end
是的,所以你有这样的东西?
IDL> table = { a: findgen(10), b: 2. * findgen(10) }
创建一个新的 table,定义单行的外观并将其复制适当的次数:
IDL> new_table = replicate({a: 0.0, b: 0.0}, 10)
然后将列复制过来:
IDL> new_table.a = table.a
IDL> new_table.b = table.b
您的新 table 可以按行或列访问:
IDL> print, new_table[5]
{ 5.00000 10.0000}
IDL> print, new_table.a
0.00000 1.00000 2.00000 3.00000 4.00000 5.00000 6.00000
7.00000 8.00000 9.00000
你也可以在不知道标签名称的情况下执行此操作(未经测试的代码):
; suppose table is a structure containing arrays
tnames = tag_names(table)
new_table = create_struct(tnames[0], (table.(0))[0]
for t = 1L, n_tags(table) - 1L do begin
new_table = create_struct(new_table, tnames[t], (table.(t))[0])
endfor
table = replicate(table, n_elements(table.(0)))
for t = 0L, n_tags(table) - 1L do begin
new_table.(t) = table.(t)
endfor
mgalloy 的解决方案也帮助了我。由于无法添加评论,我已经用修复程序更新了他的代码。
; suppose table is a structure containing arrays
tnames = tag_names(table)
new_table = create_struct(tnames[0], (table.(0))[0])
for t = 1L, n_tags(table) - 1L do begin
new_table = create_struct(new_table, tnames[t], (table.(t))[0])
endfor
new_table = replicate(new_table, n_elements(table.(0)))
for t = 0L, n_tags(table) - 1L do begin
new_table.(t) = table.(t)
endfor