A.5 结构化和记录式数组

    定义结构化dtype(请参考NumPy的在线文档)的方式有很多。最典型的办法是元组列表,各元组的格式为(field_name,field_data_type)。这样,数组的元素就成了元组式的对象,该对象中各个元素可以像字典那样进行访问:

    1. Out[147]: ( 1.5, 6)
    2. In [148]: sarr[0]['y']

    字段名保存在dtype.names属性中。在访问结构化数组的某个字段时,返回的是该数据的视图,所以不会发生数据复制:

    1. In [150]: dtype = [('x', np.int64, 3), ('y', np.int32)]
    2. In [151]: arr = np.zeros(4, dtype=dtype)
    3. In [152]: arr
    4. Out[152]:

    在这种情况下,各个记录的x字段所表示的是一个长度为3的数组:

    这样,访问arr[‘x’]即可得到一个二维数组,而不是前面那个例子中的一维数组:

    1. In [154]: arr['x']
    2. Out[154]:
    3. array([[0, 0, 0],
    4. [0, 0, 0],
    5. [0, 0, 0],

    pandas的DataFrame并不直接支持该功能,但它的分层索引机制跟这个差不多。

    为什么要用结构化数组

    跟pandas的DataFrame相比,NumPy的结构化数组是一种相对较低级的工具。它可以将单个内存块解释为带有任意复杂嵌套列的表格型结构。由于数组中的每个元素在内存中都被表示为固定的字节数,所以结构化数组能够提供非常快速高效的磁盘数据读写(包括内存映像)、网络传输等功能。