ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Numpy之Ndarray对象、数据类型和属性

2022-07-29 22:34:53  阅读:163  来源: 互联网

标签:dtype 数据类型 print Ndarray 数组 np Numpy ndarray


一、NumPy Ndarray 对象

NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。

ndarray 对象是用于存放同类型元素的多维数组。

ndarray 中的每个元素在内存中都有相同存储大小的区域。

ndarray 内部由以下内容组成:

  • 一个指向数据(内存或内存映射文件中的一块数据)的指针。

  • 数据类型或 dtype,描述在数组中的固定大小值的格子。

  • 一个表示数组形状(shape)的元组,表示各维度大小的元组。

  • 一个跨度元组(stride),其中的整数指的是为了前进到当前维度下一个元素需要"跨过"的字节数。

numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)

 

名称

描述
object 数组或嵌套的数列
dtype 数组元素的数据类型,可选
copy 对象是否需要复制,可选
order 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)
subok 默认返回一个与基类类型一致的数组
ndmin 指定生成数组的最小维度

 

 1 import numpy as np
 2 a = np.array([1,2,3])  
 3 print (a)
 4 [1 2 3]
 5 # 多于一个维度  
 6 a = np.array([[1,  2],  [3,  4]])  
 7 print (a)
 8 [[1 2]
 9  [3 4]]
10 # 最小维度  
11 a = np.array([1,2,3,4],ndmin = 3)
12 print(a)
13 [[[1 2 3 4]]]
14 # dtype 参数  
15 a = np.array([1,  2,  3], dtype = float)  
16 print (a)
17 [1. 2. 3.]

 

二、数据类型

numpy 支持的数据类型比 Python 内置的类型要多很多,基本上可以和 C 语言的数据类型对应上,其中部分类型对应为 Python 内置的类型。下表列举了常用 NumPy 基本类型。

名称描述
bool_ 布尔型数据类型(True 或者 False)
int_ 默认的整数类型(类似于 C 语言中的 long,int32 或 int64)
intc 与 C 的 int 类型一样,一般是 int32 或 int 64
intp 用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32 或 int64)
int8 字节(-128 to 127)
int16 整数(-32768 to 32767)
int32 整数(-2147483648 to 2147483647)
int64 整数(-9223372036854775808 to 9223372036854775807)
uint8 无符号整数(0 to 255)
uint16 无符号整数(0 to 65535)
uint32 无符号整数(0 to 4294967295)
uint64 无符号整数(0 to 18446744073709551615)
float_ float64 类型的简写
float16 半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位
float32 单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位
float64 双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位
complex_ complex128 类型的简写,即 128 位复数
complex64 复数,表示双 32 位浮点数(实数部分和虚数部分)
complex128 复数,表示双 64 位浮点数(实数部分和虚数部分)

 

三、数据类型对象 (dtype)

数据类型对象(numpy.dtype 类的实例)用来描述与数组对应的内存区域是如何使用,它描述了数据的以下几个方面::

  • 数据的类型(整数,浮点数或者 Python 对象)
  • 数据的大小(例如, 整数使用多少个字节存储)
  • 数据的字节顺序(小端法或大端法)
  • 在结构化类型的情况下,字段的名称、每个字段的数据类型和每个字段所取的内存块的部分
  • 如果数据类型是子数组,那么它的形状和数据类型是什么。

字节顺序是通过对数据类型预先设定 < 或 > 来决定的。 < 意味着小端法(最小值存储在最小的地址,即低位组放在最前面)。> 意味着大端法(最重要的字节存储在最小的地址,即高位组放在最前面)。

dtype 对象是使用以下语法构造的:

numpy.dtype(object, align, copy)
  • object - 要转换为的数据类型对象
  • align - 如果为 true,填充字段使其类似 C 的结构体。
  • copy - 复制 dtype 对象 ,如果为 false,则是对内置数据类型对象的引用
 1 # 使用标量类型
 2 dt = np.dtype(np.int32)
 3 print(dt)
 4 int32
 5 # int8, int16, int32, int64 四种数据类型可以使用字符串 'i1', 'i2','i4','i8' 代替
 6 dt = np.dtype('i4')
 7 print(dt)
 8 dtype('int8')
 9 # 字节顺序标注
10 dt = np.dtype('<i4')
11 print(dt)
12 int32
13 # 首先创建结构化数据类型
14 dt = np.dtype([('age',np.int8)]) 
15 print(dt)
16 [('age', 'i1')]
17 # 将数据类型应用于 ndarray 对象
18 dt = np.dtype([('age',np.int8)]) 
19 a = np.array([(10,),(20,),(30,)], dtype = dt) 
20 print(a)
21 [(10,) (20,) (30,)]
22 # 类型字段名可以用于存取实际的 age 列
23 dt = np.dtype([('age',np.int8)]) 
24 a = np.array([(10,),(20,),(30,)], dtype = dt) 
25 print(a['age'])
26 [10 20 30]
27 # 定义一个结构化数据类型 student,包含字符串字段 name,整数字段 age,及浮点字段 marks,并将这个 dtype 应用到 ndarray 对象
28 student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')]) 
29 print(student)
30 [('name', 'S20'), ('age', 'i1'), ('marks', '<f4')]
31 student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')]) 
32 a = np.array([('abc', 21, 50),('xyz', 18, 75)], dtype = student) 
33 print(a)
34 print('姓名:',a['name'])
35 print('年龄:', a['age'])
36 print('成绩:',a['marks'])
37 [(b'abc', 21, 50.) (b'xyz', 18, 75.)]
38 姓名: [b'abc' b'xyz']
39 年龄: [21 18]
40 成绩: [50. 75.]

 

四、NumPy 数组属性

NumPy 数组的维数称为秩(rank),秩就是轴的数量,即数组的维度,一维数组的秩为 1,二维数组的秩为 2,以此类推。

在 NumPy中,每一个线性的数组称为是一个轴(axis),也就是维度(dimensions)。比如说,二维数组相当于是两个一维数组,其中第一个一维数组中每个元素又是一个一维数组。所以一维数组就是 NumPy 中的轴(axis),第一个轴相当于是底层数组,第二个轴是底层数组里的数组。而轴的数量——秩,就是数组的维数。

属性说明
ndarray.ndim 秩,即轴的数量或维度的数量
ndarray.shape 数组的维度,对于矩阵,n 行 m 列
ndarray.size 数组元素的总个数,相当于 .shape 中 n*m 的值
ndarray.dtype ndarray 对象的元素类型
ndarray.itemsize ndarray 对象中每个元素的大小,以字节为单位
ndarray.flags ndarray 对象的内存信息
ndarray.real ndarray元素的实部
ndarray.imag ndarray 元素的虚部
ndarray.data 包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。

 

 1 # ndarray.ndim 用于返回数组的维数,等于秩
 2 a = np.arange(24) 
 3 print(a)
 4 print ('a维度:' , a.ndim)             # a 现只有一个维度
 5 # 现在调整其大小
 6 b = a.reshape(2,2,6)  # b 现在拥有三个维度
 7 print(b)
 8 print ('b维度:' , b.ndim)
 9 [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
10 a维度: 1
11 [[[ 0  1  2  3  4  5]
12   [ 6  7  8  9 10 11]]
13 
14  [[12 13 14 15 16 17]
15   [18 19 20 21 22 23]]]
16 b维度: 3
17 # ndarray.shape 表示数组的维度,返回一个元组,这个元组的长度就是维度的数目,即 ndim 属性(秩)
18 a = np.array([[1,2,3],[4,5,6]])  
19 print (a.shape)
20 b = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])  
21 print(b.shape)
22 (2, 3)
23 (2, 2, 3)
24 # 调整数组大小
25 a = np.array([[1,2,3],[4,5,6]]) 
26 a.shape =  (3,2)
27 print (a)
28 a.shape =  (1,6)
29 print (a)
30 [[1 2]
31  [3 4]
32  [5 6]]
33 [[1 2 3 4 5 6]]
34 # NumPy 也提供了 reshape 函数来调整数组大小
35 a = np.array([[1,2,3],[4,5,6]])
36 b = a.reshape(3,2)  
37 print (b)
38 [[1 2]
39  [3 4]
40  [5 6]]
41 # ndarray.itemsize 以字节的形式返回数组中每一个元素的大小
42 # 数组的 dtype 为 int8(一个字节)  
43 x = np.array([1,2,3,4,5], dtype = np.int8)  
44 print (x.itemsize)
45  
46 # 数组的 dtype 现在为 float64(八个字节) 
47 y = np.array([1,2,3,4,5], dtype = np.float64)  
48 print (y.itemsize)
49 1
50 8
51 # ndarray.flags 返回 ndarray 对象的内存信息
52 x = np.array([1,2,3,4,5])  
53 print (x.flags)
54   C_CONTIGUOUS : True
55   F_CONTIGUOUS : True
56   OWNDATA : True
57   WRITEABLE : True
58   ALIGNED : True
59   WRITEBACKIFCOPY : False
60   UPDATEIFCOPY : False

ndarray.flags 返回 ndarray 对象的内存信息,包含以下属性:

属性描述
C_CONTIGUOUS (C) 数据是在一个单一的C风格的连续段中
F_CONTIGUOUS (F) 数据是在一个单一的Fortran风格的连续段中
OWNDATA (O) 数组拥有它所使用的内存或从另一个对象中借用它
WRITEABLE (W) 数据区域可以被写入,将该值设置为 False,则数据为只读
ALIGNED (A) 数据和所有元素都适当地对齐到硬件上
UPDATEIFCOPY (U) 这个数组是其它数组的一个副本,当这个数组被释放时,原数组的内容将被更新

标签:dtype,数据类型,print,Ndarray,数组,np,Numpy,ndarray
来源: https://www.cnblogs.com/ikunn/p/16533745.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有