【问题标题】:How can I save float arrays in a multiple dimension array in IDL?如何在 IDL 中将浮点数组保存在多维数组中?
【发布时间】:2017-08-08 09:44:17
【问题描述】:

我正在尝试将许多浮点数组保存在一个多维度数组中。每个浮点数组都属于维度数组中的特定索引。

浮点数组的数组大小为[128, 128]

我尝试了什么?

(我把它简单化了,现在我没有使用 [128, 128] 尺寸。)

multiple_array = MAKE_ARRAY(5, 3, /FLOAT)
> multiple_array
  0.00000000      0.00000000      0.00000000      0.00000000      0.00000000
  0.00000000      0.00000000      0.00000000      0.00000000      0.00000000
  0.00000000      0.00000000      0.00000000      0.00000000      0.00000000

float_array = FLTARR(3, 3)
;skipped setting some simple values

> float_array
   1.0000000       2.0000000       3.0000000
   4.0000000       5.0000000       6.0000000
   7.0000000       8.0000000       9.0000000

multiple_array[0, 0] = float_array
   1.0000000       2.0000000       3.0000000      0.00000000      0.00000000
   4.0000000       5.0000000       6.0000000      0.00000000      0.00000000
   7.0000000       8.0000000       9.0000000      0.00000000      0.00000000

这实际上 不是我想要的!我的 float_array 不应该覆盖我的多个数组中的其他索引,而应该只覆盖第一个索引 (multiple_array[0, 0])

我想要什么:

我在想这样的事情:

(假设这段代码可以像其他编程语言一样工作)

multiple_array[0, 0] = float_array
   FIRST_FLOAT_ARRAY       0.0000000       0.0000000      0.00000000      0.00000000
   0.0000000               0.0000000       0.0000000      0.00000000      0.00000000
   0.0000000               0.0000000       0.0000000      0.00000000      0.00000000

后来我的multiple_array 应该是这样的:

> multiple_array
   FIRST_FLOAT_ARRAY       SECOND_FLOAT_ARRAY       THIRD_FLOAT_ARRAY      FOURTH_FLOAT_ARRAY      FIFTH_FLOAT_ARRAY
   SIXTH_FLOAT_ARRAY       0.0000000                0.0000000              0.00000000              0.00000000
   0.0000000               0.0000000                0.0000000              0.00000000              0.00000000

...等等

以后用这个做什么?

稍后我想像这样获得这些值:

current_float_array = multiple_array[0, 0]
> help, current_float_array
CURRENT_FLOAT_ARRAY               FLOAT     = Array[3, 3]

> current_float_array
   1.0000000       2.0000000       3.0000000
   4.0000000       5.0000000       6.0000000
   7.0000000       8.0000000       9.0000000

这甚至可能吗?对我来说这实际上并不重要,如果我的multiple_array 以 PTRARR 或其他任何形式结束,只要我有像 current_float_array 这样的结果,我就会很高兴。

提前感谢您的帮助! 我期待着任何建议。

【问题讨论】:

    标签: idl-programming-language


    【解决方案1】:

    你很好地回答了你自己的非常好的框架问题。 :-) 我可以添加更多选项。

    在您的子数组大小相同 (128x128) 的情况下,IDL 中的一种常见方法是使用更高维数组来包含其中的几个。在这种情况下,如果您想要一个 (5x3) 子数组数组,您可以创建:

    multidim_array = FltArr(128, 128, 5, 3)
    

    要访问一个 128x128 子数组,请使用,例如:

    current_float_array = multidim_array[*, *, 0, 0]
    help, current_float_array
    CURRENT_FLOAT_ARRAY               FLOAT     = Array[128, 128]
    

    请注意,如果 trailing 维度的长度为 1,IDL 会丢弃它们,因此我们得到 Array[128, 128] 而不是 Array[128, 128, 1, 1]。

    注意效率:当您将数据加载到这个数组时,而不是寻址 128x128 子数组,如果您只指定起始元素,IDL 将更快地完成分配。所以,使用:

    multidim_array[0, 0, 0, 0] = float_array
    

    而不是:

    multidim_array[*, *, 0, 0] = float_array
    

    (一般规则是,在幕后,IDL 接受任何“*”项并将它们扩展为一组索引,用于逐个移动每个数据元素。如果只给出起始元素,则整个数组可以作为一个块复制。)

    请注意,这正是您在上面的第一个测试中无意中所做的 (multiple_array[0, 0] = float_array),这不是您当时想要的。

    当数组非常大时,multidim_array 方法和您的 PtrArr 方法各有优缺点,其中内存大小和处理时间可能需要权衡取舍,但在小型应用程序中,任何一种方法都是合理的。

    另一种方法(至少从 IDL 8.1 开始)是使用 LIST 数据类型,允许子数组具有不同的大小。事实上,列表的元素可以是任何东西(比如您的子数组),您可以使用简单的数组索引语法访问这些条目(甚至索引子数组)。以下是您可以执行的操作示例,将 a 创建为列表列表:

    IDL> a=list(list(indgen(2,3),indgen(3,4)), list(indgen(2,4)))
    IDL> a
    [
        [
            [[0, 1], [2, 3], [4, 5]],
            [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]]
        ],
        [
            [[0, 1], [2, 3], [4, 5], [6, 7]]
        ]
    ]
    IDL> a[0]
    [
        [[0, 1], [2, 3], [4, 5]],
        [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]]
    ]
    IDL> a[0,1]
           0       1       2
           3       4       5
           6       7       8
           9      10      11
    

    您可以在循环中将数据加载到这样的列表列表中(抱歉,未经测试,但相信是正确的):

    multiple_list = List()
    FOR rowI = 0, 3 DO BEGIN
       row_list = List
       FOR columnI = 0, 5 DO $
          row_list.Add, GetYourFloatArrayHerePossiblyUsing(columnI, rowI)
       multiple_list.Add, row_list
    ENDFOR ; rowI over all rows
    

    你可以访问第一个数组:

    multiple_list[0, 0]
    

    还有:

    multiple_list[0, 0, 0, 0]     ; first element of first array
    multiple_list[2, 4, 127, 127] ; last element of last array
    

    希望对你有帮助!

    【讨论】:

    • 非常感谢您的回答。我选择了您的帖子作为答案,因为我认为将浮点数组保存在多维数组中会更好,并且在我看来更容易更快:D。我还有一个小问题:使用此解决方案,您可以将 float 数组保存在 multidim 数组中。是否还有类似的方法可以将 struct 保存在 multidim 数组中?我还想先定义一个多数组,然后在数组的某个位置一个接一个地添加一个结构。如果无法先定义多数组,是否还有可以一个一个添加结构的解决方案?
    • 是的,使用structArray = Replicate({myStruct, a:0, b:''}, [3, 4, 2])structArray[2, 0, 1] = {a:42, b:'hi'} 可以轻松完成多维结构数组。更多信息Harris docs site
    【解决方案2】:

    我只是以某种方式自己找到了答案。 这实际上很容易。我也希望这对其他人有所帮助。

    这是你必须做的:

    不用设置/FLOAT,只需在MAKE_ARRAY函数中设置/PTR即可:

    multiple_array = MAKE_ARRAY(5, 3, /PTR)
    > multiple_array
    <NullPointer><NullPointer><NullPointer><NullPointer><NullPointer>
    <NullPointer><NullPointer><NullPointer><NullPointer><NullPointer>
    <NullPointer><NullPointer><NullPointer><NullPointer><NullPointer>
    

    一如既往地定义你的float_array

    float_array = FLTARR(3, 3)
    ;skipped setting some simple values
    
    > float_array
       1.0000000       2.0000000       3.0000000
       4.0000000       5.0000000       6.0000000
       7.0000000       8.0000000       9.0000000
    

    最重要的部分:

    将你的浮点数组定义为PTR_NEW,这样你就可以将你的浮点数组保存在第一个索引中。

    multiple_array[0,0] = PTR_NEW(float_array)
    > multiple_array
    <PtrHeapVar1><NullPointer><NullPointer><NullPointer><NullPointer>
    <NullPointer><NullPointer><NullPointer><NullPointer><NullPointer>
    <NullPointer><NullPointer><NullPointer><NullPointer><NullPointer>
    
    > multiple_array[0,0]
    <PtrHeapVar1>
    

    通过在数组前面放置*,您将打印出浮点数组的内容。

    > *multiple_array[0,0]
       1.0000000       2.0000000       3.0000000
       4.0000000       5.0000000       6.0000000
       7.0000000       8.0000000       9.0000000
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-06
      • 2014-08-03
      • 2012-10-25
      • 2014-09-14
      • 2021-01-21
      • 1970-01-01
      相关资源
      最近更新 更多