1. 程式人生 > >『Numpy』內存分析_numpy.dtype內存數據解析方式指導

『Numpy』內存分析_numpy.dtype內存數據解析方式指導

print mes 字典 IE lean del signed mat 不改變

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")

『Numpy』內存分析_numpy.dtype內存數據解析方式指導