Numpy科学计算库
一:创建Numpy数组
1.定义
Numpy(Numeric Python)
- 提供了多维数组、矩阵的常用操作和一些高效的科学计算函数。
- 底层运算通过C语言实现,处理速度快、效率高,适用于大规模多维数组。
- 可以直接完成数组和矩阵运算,无需循环。
2.导入Numpy库
- import numpy as np (在调用Numpy中的函数时,一定要加上前缀np)
- from numpy import * (在调用Numpy中的函数时,可以不加前缀)
3.创建数组
array([ 列表 ]/( 元组 ), dtype= 数据类型 )
- dtype数据类型接口可省略,在使用Python列表或元组、创建NumPy数组时,所创建的数组类型,由原来的元素类型推导而来。也可以由dtype来直接规定;
- NumPy要求数组中所有元素的数据类型必须是一致的。
4.数组的属性
属性 | 描述 |
---|---|
ndim | 数组的维度 |
shape | 数组的形状 |
size | 数组元素的总个数 |
dtype | 数组中元素的类型 |
itemsize | 数组中每个元素的字节数 |
5.创建特殊数组
函数 | 功能描述 |
---|---|
np.arange(起始数字,结束数字,步长,dtype) | 创建数字序列数组 |
np.ones(shape,dtype) | 创建全1数组 |
np.zeros(shape,dtype) | 创建全0数组 |
np.eye(shape,dtype) | 创建单位矩阵 |
np.linspace(起始数字,结束数字,元素个数,dtype) | 创建等差数列 |
np.logspace(起始指数,结束指数,元素个数,基,dtype) | 创建等比数列 |
6.转换数组
asarray()函数: 将列表或元组转化为数组对象。
- 当数据源本身是一个ndarray对象时,array()会复制出一个副本,占用新的内存,而asarray()则不复制副本, 它直接引用原数组。
二:数组运算
1.数组元素切片
- 可以使用切片来访问NumPy数组中的一部分,切片方法和Python序列数据结构的切片一样;
2.改变数组形状
函数 | 功能描述 |
---|---|
np.reshape(shape) | 不改变当前数组,按照shape创建新的数组 |
np.resize(shape) | 改变当前数组,按照shape创建数组 |
- 当改变形状时,应该考虑到数组中元素的个数,确保改变前后,元素总个数相等;
- 参数-1:根据数组中元素总个数、以及其他维度的取值,来自动计算出这个维度的取值,例如:
import numpy as np
a = np.arange(12)
b = a.reshape(3,-1)
print(a)
print(b)
print(b.shape)
[ 0 1 2 3 4 5 6 7 8 9 10 11]
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
(3, 4)
3.数组运算
加减乘除
- 相加的2个数组的形状和长度应该一致,否则就会出现错误;
- 一维数组可以和多维数组相加,相加时会将一维数组扩展至多维;
- 数组之间的减法、乘法、除法运算,和加法运算规则相同;
- 当两个数组中元素的数据类型不同时,精度低的数据类型,会自动转换为精度更高的数据类型,然后再进行运算。
矩阵乘法
- 乘号运算符 *:矩阵中对应的元素分别相乘
- 矩阵相乘{np.dot();np.matmul()}:按照矩阵相乘的规则运算
数组的的转置和求逆
- 数组转置—— np.transpose()
- 数组求逆—— np.linalg.inv()
4.数组元素运算
函数 | 功能描述 |
---|---|
np.sum(array,axis) | 计算所有元素的和 |
np.prod() | 计算所有元素的乘积 |
np.diff() | 计算数组的相邻元素之间的差 |
np.sqrt() | 计算各元素的平方根 |
np.exp() | 计算各元素的指数值 |
np.abs() | 取各元素的绝对值 |
-
sum()——对数组中所有元素求和
-
按行求和&按列求和
- 轴(axes):数组中的每一个维度被称为一个
- 秩(rank):轴的个数,一维数组(rank=1),二维数组(rank=2),三维数组(rank=3)
二维数组举例
c = np.arange(12).reshape(3,4)
print(c)
np.sum(c,axis=0) #按列求和
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
array([12, 15, 18, 21])
np.sum(c,axis=1) #按行求和
array([ 6, 22, 38])
- sprt()函数实例:
d = np.logspace(1,4,4,base=2)
d
array([ 2., 4., 8., 16.])
np.sqrt(d)
array([1.41421356, 2. , 2.82842712, 4. ])
5.数组堆叠运算
np.stack( ( 数组 1, 数组 2,…) , axis)
- 执行NumPy函数前,如果有python列表,则首先自动把Python列表转换为NumPy数组,和数据类型转换,然后再进行堆叠
三:矩阵和随机数
1.矩阵
- 矩阵的创建
- np.matrix(字符串/列表/元组/数组 )
- np.mat(字符串/列表/元组/数组 )
- 矩阵对象的属性
属性 | 描述 |
---|---|
.ndim | 矩阵的维数 |
.shape | 矩阵的形状 |
.size | 矩阵的元素总个数 |
.dtype | 矩阵元素的数据类型 |
- 矩阵运算
- 矩阵相乘 a*b
- 矩阵转置 a.T
- 矩阵求逆 a.I
2.随机数模块 np.random
函数 | 功能描述 | 返回值 |
---|---|---|
np.random.rand(d0,d1,…,dn) | 元素在[0,1)区间均匀分布的数组 | 浮点数 |
np.random.uniform(low,hige, size) | 元素在[low,hige)区间均匀分布的数组 | 浮点数 |
numpy.random.randint(low,hige, size) | 元素在[low,hige)区间均匀分布的数组 | 整数 |
np.random.randn(d0,d1,…,dn) | 产生标准正态分布的数组 | 浮点数 |
np.random.normal(loc, scale, size) | 产生正态分布的数组 | 浮点数 |
- 因为是随机数,使用同样的语句,所得到的结果也是不同的。
np.random.rand(2,3)
array([[0.12616194, 0.44501057, 0.67152549],
[0.75359755, 0.5818422 , 0.65866233]])
np.random.uniform(2,5,(4,3))
array([[2.54701723, 4.80398693, 2.33308575],
[3.64370624, 3.59986233, 3.6292718 ],
[2.20305486, 2.46791211, 4.91596931],
[4.24011085, 4.70773334, 3.39320752]])
-
伪随机数:由随机种子,根据一定的算法生成的。
-
随机种子: 指定随机数生成时所用算法开始的整数值。
-
如果使用相同的seed( )值,则每次生成的随即数都相同。
-
如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同。
-
设置的seed()值仅一次有效。
-
随机数产生的算法,和系统有关。
-
np.random.shuffle( 序列 )
-
序列指Python列表、umPy数组等;
-
对于多维数组,使用shuffle()函数只打乱第一维元素。
e = np.arange(12).reshape(3,4)
e
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
np.random.shuffle(e)
e
array([[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[ 0, 1, 2, 3]])