Numpy 快速计算科学库
简介
- 一个开源的
Python
科学计算库,用于快速处理任意维度的数组 - 支持常见的数组和矩阵操作。对于同样的数值计算任务
- 使用
ndarray
对象来处理多维数组,该对象是一个快速而灵活的大数据容器。
导包:import numpy as np
数组基本信息
NumPy
提供了一个N维数组类型ndarray
,它描述了相同类型的items
的集合(数组中元素的数据类型相同)
ndarray
比原生python
列表运行计算时大约快10倍,原因:
- 因为
ndarray
仅能存储相同类型的数据(存在一个小数,则所有的整数均化为小数),其直接指向数据而非内存地址 - 底层由
c
编写,内部解除了GIL(全局解释器锁) Numpy
内置并行运算功能,并会自定进行并行运算
属性
属性名字 | 属性解释 |
---|---|
ndarray数组名.shape | 数组维度的元组 |
ndarray数组名.ndim | 数组维数 |
ndarray数组名.size | 数组中的元素数量 |
ndarray数组名.itemsize | 一个数组元素的长度(字节) |
ndarray数组名.dtype | 数组元素的类型 |
数据形状
a = np.array([1,2,3,4]) # 一维数组 形状元组为(4,)
b = np.array([[1,2,3],[4,5,6]]) # 二维数组 形状元祖为(2,3)
c = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]]) # 三维数组 形状元祖为(2,2,3)
数据类型
数据名称 | 描述 | 数据简写字符 |
---|---|---|
np.bool | 用一个字节存储的布尔类型(True或False) | b |
np.int8 | 一个字节大小,-128 至 127 | i1 |
np.int16 | 整数,-32768 至 32767 | i2 |
np.int32 | 整数,-2^31 至 2^32 -1 | i4 和i |
np.int64 | 整数,-2^63 至 2^63 - 1 | i8 |
np.uint8 | 无符号整数,0 至 255 | u1 |
np.uint16 | 无符号整数,0 至 65535 | u2 |
np.uint32 | 无符号整数,0 至 2^32 - 1 | u4 |
np.uint64 | 无符号整数,0 至 2^64 - 1 | u8 |
np.float16 | 半精度浮点数:16位,正负号1位,指数5位,精度10位 | f2 |
np.float32 | 单精度浮点数:32位,正负号1位,指数8位,精度23位 | f4 |
np.float64 | 双精度浮点数:64位,正负号1位,指数11位,精度52位 | f8 |
np.complex64 | 复数,分别用两个32位浮点数表示实部和虚部 | c8 |
np.complex128 | 复数,分别用两个64位浮点数表示实部和虚部 | c16 |
np.object_ | python对象 | O |
np.string_ | 字符串(字节流) | S |
np.unicode_ | unicode类型 | U |
三种指定数组元素数据类型方式
b = np.array([[1,2,3],[4,5,6]], dtype = np.float32 )
b = np.array([[1,2,3],[4,5,6]], dtype = 'float32' )
b = np.array([[1,2,3],[4,5,6]]dtype = 'f4')
操作数组
生成数组
零一数组
- 全零数组
np.zeros(shape, dtype)
若不指定dtype
则 默认为float64型
np.zeros_like(已存在的数组名, dtype)
根据指定的存在数组的 形状生成 全零数组 - 全一数组
np.ones(shape, dtype)
若不指定dtype
则 默认为float64型
np.ones_like(已存在的数组名, dtype)
根据指定的存在数组的 形状生成 全零数组 - 单位矩阵
np.eye(值)
生成一个指定值行列的单位矩阵 np.full(shape, 指定值)
填充出一个全指定值的数组
注意:
shape
表示数组维度的元组,例:(2,3)两行三列的二维数组zeros_like
和ones_like
仅仅是根据传入数组的维度 生成新的数组,而非修改传入的数组dtype=上表中的数组名称
(dtype=np.int16
)和dtype="数据简写字符"
(dtype="u2"
)两种传参方式
从现有数组生成
np.array(已有数组名, dtype)
np.asarray(已有数组名, dtype)
注意:
- 区别在于两者的拷贝已有数组的深度:
np.arrary()
表示深拷贝np.asarray()
为浅拷贝
固定范围数组
-
范围平分(等差数列)
np.linspace (起始值, 终止值, 平分份数, endpoint)
平分份数默认为:50份,endpoint=False
表示不包含终止值,默认包含终止值
-
设置步长(等差数列)
np.arange(起始值,终止值, 步长, dtype)
当 加步长 超过 终止值时 数值停止,步长默认为 1,默认不包含终止值
-
范围平分得指数(等比数列)
np.logspace(起始值, 终止值, 平分份数, base=底数)
,默认包含终止值;底数默认为:10
随机数组
均匀分布数据数组
-
生成0到1之间随机值的数组
格式:np.random.rand(shape)
shape
去括号
作用:创建一个 指定数组维数的 填充0到1之间随机值的数组
-
指定范围的随机值数组
格式np.random.uniform(low=采样下界, high=采样上界, size=shape)
不可指定dtype
功能:从一个均匀分布[low,high)
中随机采样,注意定义域是左闭右开low
: 采样边界1,float
类型,默认值为0.0
;值可比high
大high
: 采样边界2,float
类型,默认值为1.0
;可省略size
: 输出样本的数组维度元祖,缺省时输出1个值
-
指定范围的随机整值数组
np.random.randint(low,high=None,size=shape,dtype='i')
不包含终止值
功能:从一个均匀分布中随机采样,生成一个整数或N维整数数组,
取数范围:若high
不为None
时,取[low,high)
之间随机整数,否则取值[0,low)
之间随机整数
正态分布随机数组
正态分布:一种概率分布。正态分布是具有两个参数μ
和σ
的连续型随机变量的分布,所以正态分布记作N(μ,σ )
-
μ
是服从正态分布的随机变量的 均值,表示数组越靠近μ
,概率越大 -
σ
是此随机变量的 标准差,σ
越大表示越离散,图形越矮胖
-
标准正态分布(
μ=0
和σ=1
)随机值数组
格式:np.random.randn(shape)
shape
去括号 -
指定
μ
和σ
的正态分布随机数组
格式:np.random.normal(loc=均值, scale=标准差, size=shape)
shape
默认为:None
,即返回一个随机值 -
np.random.standard_normal(size=shape)
返回指定形状的标准正态分布的数组,默认为:None
与np.random.randn(shape)
没有太大差异
数组操作
索引和切片
二维数组的切片盒索引是:先行后列 (从外向里依次的下标)
形状修改
注意:在转换形状的时候,一定要注意变形前后的数组元素个数必须一致
ndarray数组名.reshape(shape, order)
不修改原有数组,而是生成一个新数组ndarray数组名.resize(new_shape)
修改原有数组的shape
,shape
中-1
表示自行计算该维度元素个数,最多有一个- 数组转置:
ndarray数组名.T
,行列装换,生成新数组,不修改原数组
类型转换
ndarray数组名.astype(type)
返回修改为指定类型之后的数组
例:stock_int.astype(np.int32)
ndarray数组名.tostring()或者ndarray数组名.tobytes()
构造包含数组中原始数据的Python字符串和字节np.unique(数组名)
数组的去重并一维数组输出temp = np.array([[1, 2, 3, 4],[3, 4, 5, 6]]) np.unique(temp) array([1, 2, 3, 4, 5, 6])
数组运算
逻辑判断 和 布尔赋值
# 逻辑判断, 如果成绩大于60就标记为True 否则为False 注意仅判断不修改
>>> test_score > 60
array([[ True, True, True, False, True],
[ True, True, True, False, True],
[ True, True, False, False, True],
[False, True, True, True, True]])
# 布尔赋值, 将满足条件的设置为指定的值-布尔索引 修改原数组数据
>>> test_score[test_score > 60] = 1
>>> test_score
array([[ 1, 1, 1, 52, 1],
[ 1, 1, 1, 59, 1],
[ 1, 1, 44, 44, 1],
[59, 1, 1, 1, 1]])
复合逻辑判断:结合np.logical_and
和np.logical_or
使用
# 将大于60且小于90的标记为True 否则为False 注意仅判断不修改
np.logical_and(temp > 60, temp < 90)
# 将大于90或小于60的数据修改为1 会修改原数组的数据
temp[np.logical_or(temp > 90, temp < 60)] = 1
通用判断函数
np.all()
全真才真,一假就假# 判断前两名同学的成绩[0:2, :]是否全及格 np.all(score[0:2, :] > 60) 执行结果:| True 或 False
np.any()
一真就真,全假才假# 判断前两名同学的成绩[0:2, :]是否有大于90分的 np.any(score[0:2, :] > 80) 执行结果:| True 或 False
np.where(三元运算符)
格式:np.where(条件,条件成立执行的语句,条件不成立执行的语句)
# 将大于90或小于60的换为1,否则为0
np.where(np.logical_or(temp > 90, temp < 60), 1, 0)
统计计算
作用 | 命令 |
---|---|
数组最小值 | np.min(数组, axis ) |
数组最大值 | np.max(数组, axis ) |
数组中值 | np.median(数组, axis ) 中间值或中间两个值的平均值 |
数组平均值 | np.mean(数组, axis , dtype) |
数组标准差 | np.std(数组, axis , dtype) |
数组方差 | np.var(数组, axis , dtype) |
数组最大元素对应的下标 | np.argmax(数组,axis) |
数组最小元素对应的下标 | np.argmin(数组,axis) |
注意:Numpy
中轴向(axis
)为0代表列, 为1代表行 去进行统计
数组与值计算
数组与值的加减乘除运算就是数组中的每个元素都对值进行操作
注意:若不重新赋值则不修改原数组,仅是生成一个新数组
数组与数组的运算
并非所有的数组之间都可以进行运算,仅在 shape
完全相同 和 符合广播机制 的情况下才能进行数组减运算。
-
两个数组的
shape
完全相同,对应的位置进行计算,也可以进行比较
-
符合广播机制数据
广播机制实现了时两个或两个以上数组的运算,即使这些数组的shape
不是完全相同的,共有维度只需要满足如下任意一个条件即可(比较顺序:从后往前)- 数组的某一维度等长
- 其中一个数组的维度为1
矩阵和向量运算
- 矩阵:二维数组
- 向量:一种特殊矩阵,单位矩阵包含行向量和列向量
矩阵和向量的运算符合上文的数组运算,但上文方法中的x号
运算不是数学中矩阵乘法运算(通过函数实现)
矩阵相乘
矩阵乘法遵循准则:(M行, N列)*(N行, L列) = (M行, L列)
代码实现格式:np.matmul(矩阵a,矩阵 b)
和np.dot(矩阵a,矩阵b)
注意: np.matmul()
禁止矩阵与标量(数值) 的乘法 (即np.matmul(矩阵1, 2)
会报错)
矩阵和向量乘法也符合矩阵相乘
1*1+3*5 = 16
4*1+0*5 = 4
2*1+1*5 = 7
注意:代码B = A * B
无法实现 数学上的矩阵相乘
矩阵的逆和转置
矩阵的逆:如矩阵 A 是一个 m×m 矩阵(方阵),如果有逆矩阵,则:A * A-1 = A-1 *A=1
A-1 便是矩阵A的逆
矩阵转置:将 A 的所有元素绕着一条从第 1 行第 1 列元素出发的右下方 45 度的射线作 镜面反转
Numpy
创建
访问元素
元素操作
数值计算函数
求和函数
布尔函数(逻辑判断)
线性代数函数
元素取整