• 『Numpy』内存分析_numpy.dtype解析内存数据


    numpy.dtype用于自定义数据类型,实际是指导python程序存取内存数据时的解析方式。

    【注意】,更改格式不能使用 array.dtype=int32 这样的硬性更改,会不改变内存直接该边解析过程,导致读取出问题,所以使用 array.astype(int32) ,这样才安全。

    一、基本使用示例

    // 定义一个数据类型,其中name为16为字符串,grades为2个float64的子数组
    >>> dt = np.dtype([('name', np.str_, 16), ('grades', np.float64, (2,))])
    >>> dt['name']
    dtype('<U16')
    >>> dt['grades']
    dtype(('<f8',(2,)))
    
    // 调用方法查看数组
    >>> x = np.array([('Sarah', (8.0, 7.0)), ('John', (6.0, 7.0))], dtype=dt)
    >>> x[1]
    ('John', [6.0, 7.0])
    >>> x[1]['grades']
    array([ 6.,  7.])
    >>> type(x[1])
    <type 'numpy.void'>
    >>> type(x[1]['grades'])
    <type 'numpy.ndarray'>
    

    二、dtype复杂格式概览

    1、(flexible_dtype, itemsize):不指定大小的数据类型,大小

    >>> dt = np.dtype((void, 10))  # 10位缓存区对象
    >>> dt = np.dtype((str, 35))   # 35字符字符串
    >>> dt = np.dtype(('U', 10))   # 10字符unicode string
    

     2、(fixed_dtype, shape):固定大小的类型,个数

    >>> dt = np.dtype((np.int32, (2,2)))          # 2*2int子数组
    >>> dt = np.dtype(('S10', 1))                 # 10字符字符串
    >>> dt = np.dtype(('i4, (2,3)f8, f4', (2,3))) # 2x3结构子数组
    

    3、[(field_name, field_dtype, field_shape), …]:字段名,格式(含类型大小),个数

    文首示例中的例子即为此种情况

    >>> dt = np.dtype([('big', '>i4'), ('little', '<i4')])
    >>> dt = np.dtype([('R','u1'), ('G','u1'), ('B','u1'), ('A','u1')])
    

    4、{‘names’: …, ‘formats’: …, ‘offsets’: …, ‘titles’: …, ‘itemsize’: …}:同上,使用字典来表达,且定制程度更高

    >>> dt = np.dtype({'names': ['r','g','b','a'],'formats': [uint8, uint8, uint8, uint8]})
    

    5、{‘field1’: …, ‘field2’: …, …}: 同上

    // col1在字节0处,col2在字节10处,col3在字节14处
    >>> dt = np.dtype({'col1': ('S10', 0), 'col2': (float32, 10),'col3': (int, 14)})
    

    三、获取数组的dtype

    数组的.dtype返回4的格式,将属性作为条目展示

    数组的.dtype.fields会进一步转换为5的格式,更强调字段,将之作为条目展示

    persontype = np.dtype({
        'names':['name','age','weight','height'],
        'formats':['S30','i','f','f']}, align=True)
    a = np.array([('Zhang',32,72.5,167),
                  ('Wang',24,65,170)],dtype=persontype)
    
    print(a.dtype)
    #dtype({'names':['name','age','weight','height'], 
    #       'formats':['S30','<i4','<f4','<f4'], 
    #       'offsets':[0,32,36,40], 
    #       'itemsize':44}, 
    #       align=True)
    
    
    print(a.dtype.fields)
    # mappingproxy({'age': (dtype('int32'), 32),
    #               'height': (dtype('float32'), 40),
    #               'name': (dtype('S30'), 0),
    #               'weight': (dtype('float32'), 36)})
    

    四、简单数据格式

    int32,big-edian 以及 little-endian

    >>> dt = np.dtype('>i4')  定义一个big-endian int 4*8=32位的数据类型
    >>> dt
    dtype('>i4')
    >>> dt.byteorder    //字节顺序:>为big-edian <为little-endian 
    '>'
    >>> dt.itemsize    //字节大小
    4
    >>> dt.name       //dt类型
    'int32'
    >>> dt.type is np.int32
    True
    

    简略字符参

    'b'     boolean
    'i'     (signed) integer
    'u'     unsigned integer
    'f'     floating-point
    'c'     complex-floating point
    'm'     timedelta
    'M'     datetime
    'O'     (Python) objects
    'S', 'a'    (byte-)string
    'U'     Unicode
    'V'     raw data (void)

    混编格式

    [个数] | 类型 | 字节数

    // 3字节字符串、3个8字节整型子数组、3*4的10字节字符串数组
    np.dtype("a3, 3u8, (3,4)a10")
    
  • 相关阅读:
    ASP.NET MVC 5 安全性和创建用户角色
    使用ENTITY FRAMEWORK 6以正确的方式管理DBCONTEXT:深入指南
    C#读取二进制格式的shapefile
    ASP.NET MVC 应用程序初学者常见问题汇总
    ASP.NET MVC 应用程序中使用CKEditor 4 的步骤
    html5学习笔记2
    html5学习笔记
    c#接口定义与应用
    Django ORM 优化心得
    携程的那点事
  • 原文地址:https://www.cnblogs.com/hellcat/p/8711160.html
Copyright © 2020-2023  润新知