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

原文地址:https://www.cnblogs.com/hellcat/p/8711160.html

时间: 2024-10-08 02:47:37

『Numpy』内存分析_numpy.dtype内存数据解析方式指导的相关文章

『Numpy』内存分析_numpy结构化数组

三.numpy的结构数组 『Numpy』内存分析_numpy.dtype内存数据解析方式指导 利用np.dtype可以构建结构数组,numpy.ndarray.base会返回内存主人的信息,文档如下, Help on getset descriptor numpy.ndarray.base: base    Base object if memory is from some other object.        Examples    --------    The base of an

内存分析_.Net内存原理介绍

内存原理介绍 1.       .Net应用程序中的内存 1.1.Net内存类型 Windows使用一个系统:虚拟寻址系统.这个系统的作用是将程序可用的内存地址映射到硬件内存中的实际地址上.其实际结果是在32位的Windows操作系统中,每个进程都可以使用4GB的内存,当然,64位机这个数字就更大了,在这4GB的内存中存储着可执行代码.代码加载的DLL和程序运行的所有变量,这4GB的内存成为虚拟地址空间或虚拟内存.在.Net中要使用多种类型的内存,包括:堆栈.非托管堆和托管堆. C#将数据分为2

『Numpy』内存分析_利用共享内存创建数组

引.内存探究常用函数 id(),查询对象标识,通常返回的是对象的地址 sys.getsizeof(),返回的是 这个对象所占用的空间大小,对于数组来说,除了数组中每个值占用空间外,数组对象还会存储数组长度.数组类型等其他信息 numpy.ndarray.ctypes.data属性,返回numpy数组的内存位置 array.array.buffer_info(),数组对象的内存信息,返回元素起始地址和元素个数 help(array.buffer_info)'''buffer_info(self,

『Python』内存分析_List对象内存占用分析

『Python』内存分析_下_list和array的内存增长模式 list声明后结构大体分为3部分,变量名称--list对象(结构性数据+指针数组)--list内容,其中id表示的是list对象的位置, v引用变量名称,v[:]引用list对象,此规则对python其他序列结构也成立,以下示范可用id佐证, a=b时,a和b指向同一个list对象 a=b[:]时,a的list对象和b的list对象指向同一个list内容 Q1:元素存储地址是否连续 首先见得的测试一下list对象存储的内容(结构3

『Numpy』常用方法记录

numpy教程 广播机制 numpy计算函数返回默认是一维行向量: import numpy as np a = [[1,1,1], [2,2,2], [3,3,3]] b = (np.sum(a,axis=1)) c = (np.sum(a,axis=0)) print(b,'\n',c) # [3 6 9] # [6 6 6] 所以广播之实际是高维对一维行向量的广播: 除法广播: b = a/(np.sum(a,axis=1)) c = a/(np.sum(a,axis=0)) print(

『TensorFlow』徒手装高达_战斗数据收集模块原型_save&amp;restore

顺便一提,上节定义的网络结构有问题,现已修改,之后会陆续整理上来.两种常用(我会的)的加载方式:1. ''' 使用原网络保存的模型加载到自己重新定义的图上 可以使用python变量名加载模型,也可以使用节点名 ''' import AlexNet as Net import AlexNet_train as train import random import tensorflow as tf IMAGE_PATH = './flower_photos/daisy/5673728_71b8cb5

『Python』内存分析_list和array的内存增长模式

『Python』内存分析_List对象内存占用分析 在Python中,列表是一个动态的指针数组,而array模块所提供的array对象则是保存相同类型的数值的动态数组.由于array直接保存值,因此它所使用的内存比列表少.列表和array都是动态数组,因此往其中添加新元素,而没有空间保存新的元素时,它们会自动重新分配内存块,并将原来的内存中的值复制到新的内存块中.为了减少重新分配内存的次数,通常每次重新分配时,大小都为原来的k倍.k值越大,则重新分配内存的次数越少,但浪费的空间越多.本节通过一系

C语言内存分析

一.进制 概念:进制是一种计数方式,是数值的表现形式 4种主要的进制: ①. 十进制:0~9 ②. 二进制:0和1 ③. 八进制:0~7 ④. 十六进制:0~9+a b c d e f C语言在默认的情况下为十进制. int num=1010; // 十进制 int num=0b1100; // 二进制,以0b或者是0B开头 int num=014; // 八进制,以0开头 int num=0x4; // 十六进制,以0x开头 占位符: %d和%i :十进制整数的形式输出一个值 %o :以不带符

python基础(内存分析,不引入第三方变量的方式交换变量的值)

a,b指向同一块内存地址 下面方法是重新给b赋值;a,b指向不同的内存地址 字符串或int类型内存分析 不引入第三方变量的方式,交换a,b的值 原文地址:https://www.cnblogs.com/jingw/p/9188511.html