二、Numpy基础:数组修改
一、数组属性
- 维度:.ndim,返回当前数组维度
- 类型:.dtype,返回数组内元素的数据类型,注:numpy定义的数组数据类型是统一,不能多类型混合
- 形状:.shape,返回数据形状,数组每层中的元素个数
- 元素总数:.size,返回数组中元素总个数
- 字节大小:.itemsize,返回数组中每个元素的字节大小。
import numpy as np a=np.full((2,5,4),10) print("数组a:",a) print("数组a中元素总数:",a.size) print("数组a的形状:",a.shape) print("数组a中的元素类型:",a.dtype) print("数组a的维度:",a.ndim) print("数组a中的元素字节大小:",a.itemsize) >>> 数组a: [[[10 10 10 10] [10 10 10 10] [10 10 10 10] [10 10 10 10] [10 10 10 10]] [[10 10 10 10] [10 10 10 10] [10 10 10 10] [10 10 10 10] [10 10 10 10]]] 数组a中元素总数: 40 数组a的形状: (2, 5, 4) 数组a中的元素类型: int32 数组a的维度: 3 数组a中的元素字节大小: 4
二、数据类型
- 不指定的情况下,numpy会自动推断出适合的数据类型,所以一般不需要显示给定数据类型。
- 数值型dtype的命名方式为:一个类型名称(eg:int、float等),后接一个表示各个元素位长的数字
- 如Python的float数据类型(双精度浮点值),需要占用8个字节(64位),因此在NumPy中记为float64
- 每个数据类型都有一个类型代码,即简写方式
数据类型 | 简写 | 说明 | 字节 | 范围 | |
整型 | int_ | 默认整形 | |||
intc | 等价于long的整形 | ||||
int8 | i1 | 字节整形 | 1 | [-128,127] | |
int16 | i2 | 整形 | 2 | [-32768,32767] | |
int32 | i3 | 整形 | 4 | [-2^31, 2^31-1] | |
int64 | i4 | 整形 | 6 | [-2^63, 2^63-1] | |
无符号 整型 |
uint8 | u1 | 无符号整形 | 1 | [0,255] |
uint16 | u2 | 无符号整形 | 2 | [0,65535] | |
uint32 | u3 | 无符号整形 | 1 | [0, 2^32-1] | |
uint64 | u4 | 无符号整形 | 1 | [0,2^64-1] | |
布尔 | bool_ | 布尔值 | 1 | True或者False | |
浮点型 | float_ | float64简写形式 | 8 | ||
float16 | f2 | 半精度浮点型 | 2 | 1符号位+5位指数+10位的小数部分 | |
float32 | f4或者f | 单精度浮点型 | 4 | 1符号位+8位指数+23位的小数部分 | |
float64 | f8或者d | 双精度浮点型 | 8 | 1符号位+11位指数+52位的小数部分 | |
复数 | complex_ | c16 | complex128的简写形式 | ||
complex64 | c8 | 复数,由两个32位的浮点数来表示 | 32 | ||
complex128 | c16 | 复数,由两个64位的浮点数来表示 | 64 | ||
对象 | object | O | Python对象类型 | ||
字符串 | String_ | S | 固定长度的字符串类型(每个字符1个字节) | ||
Unicode_ | U | 固定长度的unicode类型的字符串 |
三、数组修改(属性)
- 形状修改:.reshape()、.T
- 维度修改:.reshape()
- 类型修改:.astype()
3.1、reshape()方法:修改数组形状与维度
- 直接修改数组ndarray的shape值,要求修改后乘积不变。
- 直接使用reshape函数创建一个改变尺寸的新数组,原数组的shape保持不变,但是新数组和原数组共享一个内存空间,也就是修改任何一个数组中的值都会对另外一个产生影响,另外要求新数组的元素个数和原数组一致。
- 当指定某一个轴为-1的时候,表示将根据数组元素的数量自动计算该轴的长度值。
import numpy as np a=np.arange(30) print("原数组(一维):",a) b=a.reshape(2,3,5) print("新数组(三维):",b) b[1][2][2]=666 print("修改b中的数值会影响到a:",a) print("对b使用降维打击:",b.reshape(10,-1)) >>> 原数组(一维): [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29] 新数组(三维): [[[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14]] [[15 16 17 18 19] [20 21 22 23 24] [25 26 27 28 29]]] 修改b中的数值会影响到a: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 666 28 29] 对b使用降维打击: [[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 9 10 11] [ 12 13 14] [ 15 16 17] [ 18 19 20] [ 21 22 23] [ 24 25 26] [666 28 29]]
3.2、T方法:行列转置
- 使用T方法以后,可以对数组进行行列转置。
import numpy as np a=np.random.randint(1,10,size=(2,3,4)) b=a.T print(b.shape) >>> (4, 3, 2)
3.2、astype()方法:修改元素类型
- 如果需要更改一个已经存在的数组的数据类型,可以通过astype方法进行修改从而得到一个新数组。
import numpy as np a=np.arange(1,5) print("原数组:{0},其数据类型为:{1}".format(a,a.dtype)) b=a.astype(float) print("新数组:{0},其数据类型为:{1}".format(b,b.dtype)) >>> 原数组:[1 2 3 4],其数据类型为:int32 新数组:[1. 2. 3. 4.],其数据类型为:float64