如何为嵌套numpy的ndarray D型?(how to set dtype for nested

2019-10-18 17:26发布

我在下面的数据结构,从中我想创建一个ndarray工作包含的所有数据:

      instrument         filter             response
-----------------------------------------------------
       spire              250um           array of response
         ...               ...                ...

where the array of response is:
      linenumber      wavelangth      throughput
-----------------------------------------------------
         0     1.894740e+06           0.000e+00
         1     2.000000e+06           1.000e-02
         2     2.026320e+06           3.799e-02
        ...              ....              ....

所以,我希望我可以把数据发送到一个ndarray,通过使用下面的代码:

import numpy as np

data = [('spire', '250um', [(0, 1.89e6, 0.0), (1,2e6, 1e-2), (2,2.02e6,3.8e-2), ...]),
        ('spire', '350', [ (...), (...), ...]),
        ...,
        ]
table = np.array(data, dtype=[('instrument', '|S32'),
                               ('filter', '|S64'),
                               ('response', [('linenumber', 'i'),
                                             ('wavelength', 'f'),
                                             ('throughput', 'f')])
                              ])

此代码引发异常,因为有list(tuple, list(tuple))模式。 变更后的data到:

 data = [('spire', '250um', np.array([(0, 1.89e6, 0.0), (1,2e6, 1e-2), (2,2.02e6,3.8e-2), ...],
                                     dtype=[('linenumber','i'), ('wavelength','f'), ('throughput','f')])),
        ('spire', '350', np.array([ (...), (...), ...],dtype=[...])),
        ...,
        ]]

然后代码可以运行通过,然而,因为对于其结果是错误的response字段,只有响应的阵列的第一个条目被取:

>>print table[0]

('spire', '250um', (0,1.89e6,0.0))

而不是整个阵列。

我的问题是,如何正确设置dtype关键字,使这项工作? 在这两种情况下:1.其中的元组列表包含元组的嵌套列表; 2.在其中不均匀ndarray被包含的元组的嵌套列表。

先感谢您!

Answer 1:

我能得到这个工作,如果响应数组的长度是固定的(也许与NumPy必须能够预先计算每个记录的大小,以结构化的阵列?)。 作为注意到结构化阵列numpy的手册页面 ,可以以结构化的阵列指定为一个场的形状。

import numpy as np

data = [('spire', '250um', [(0, 1.89e6, 0.0), (1, 2e6, 1e-2)]),
        ('spire', '350',   [(0, 1.89e6, 0.0), (2, 2.02e6, 3.8e-2)])
        ]
table = np.array(data, dtype=[('instrument', '|S32'),
                               ('filter', '|S64'),
                               ('response', [('linenumber', 'i'),
                                             ('wavelength', 'f'),
                                             ('throughput', 'f')], (2,))
                              ])

print table[0]
# gives ('spire', '250um', [(0, 1890000.0, 0.0), (1, 2000000.0, 0.009999999776482582)])


文章来源: how to set dtype for nested numpy ndarray?