一、ndarray对象
\quad
Numpy(Numerical Python)是一个开源的python科学计算库,用于快速处理任意维度的数组,支持常见的数组和矩阵操作。Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器。
\quad
ndarray是一个n维数组类型(n-dimensional),描述了相同类型的元素的集合。python中可以用list,tuple等数据结构表示数组,元素类型可不同,嵌套可以实现多维数组。但是ndarray相比于list等类型运算效率更高。
ndarray与list效率对比
\quad
在存储数据时,ndarray数据与数据的地址都是连续的,这样使得批量操作数组元素时速度更快,而list存储的数据地址不是连续的,需要通过寻址方式找到,这与ndarray的元素类型相同而list的元素类型可不同的区别相符。
\quad
此外,numpy内置了并行运算功能,当系统有多个核心时,做某种计算时,numpy会自动做并行计算;Numpy底层使用C语言编写,内部解除了GIL(全局解释器锁),其对数组的操作速度不受Python解释器的限制,所以,其效率远高于纯Python代码。
二、数组的创建
1.array() ,asarray() 利用list,tuple对象或已有的ndarray数组创建
注意array与asarray的区别
np.array(ndarray对象)
为深拷贝
np.asarray(ndarray对象)
为浅拷贝
注意
2.特殊数组的创建
np.zeros(shape,dtype),np.zeros_like(object, dtype)
全0数组,
np.ones(shape,dtype),np.ones_like(object, dtype)
全1数组。
np.eye(m,n,k=0)
对角线k为1的m×n的单位矩阵,省略n时为m阶方阵
3.生成固定范围的数组
np.arange(start,end,step,dtype)
创建等差数列
参数start,end为始,终(不包括),step为步长
np.linspace(start,end,num,endpoint)
创建等差数列
参数num为等间隔数据的个数(默认50),endpoint为数组是否包含end值(默认True)
np.logspace(start,stop,num)
创建等比数列
4.生成随机数组np.random
模块
1)正态分布
np.random.randn(d1,d2,d3,...,dn)
生成shape为(d1,…,dn)的随机数组。
np.random.normal(loc=0.0,scale=1.0,size=None)
生成shape为size的随机数组
loc为概率分布对应的均值,scale为标准差,size为int(相当于tuple (int,)得到一维数组 ,注意不是(1,int)二维)或tuple of ints,默认为None,即只返回一个(相当于int=1)。
np.random.standard_normal(size=None)
生成指定size的服从标准正态分布的随机数组
import matplotlib.pyplot as plt
import numpy as np
y=[np.random.normal(80,5) for i in range(1000000)]
plt.figure()
plt.hist(y,bins=1000)
plt.show()
2)均匀分布
np.random.rand(d1,...,dn)
生成shape为(d1,…,dn)的数组
np.random.uniform(low=0.0,high=1.0,size=None)
生成概率分布服从U[low,high)均匀分布的数组,shape为size
np.random.randint(low,high=None,size=None,dtype='I')
生成服从均匀分布的整数数组,当high不为None时为U[low,high),否则为U[0,low),注意元素是整数。
import matplotlib.pyplot as plt
import numpy as np
y=[np.random.uniform(60,100) for i in range(1000000)]
plt.figure()
plt.hist(y,bins=1000)
plt.show()
三、数组的属性
shape,数组维度的元组 eg (1,)一维,(2,3)二维,(1,2,3)三维
dtype数组元素的类型
ndim数组的维度
size数组的元素数量(和上文函数的参数size不是一个东西)
itemsize一个数组元素的长度(字节)
四、数组的索引和切片
\quad
高维和一维类似,n维数组可以使用1~n个索引来获取子数组,每个维度也都可以使用切片。以一维数组进行说明
1. 索引值从0开始
2. 有和列表类似的切片,切割一维数组的元素
\quad
使用切割运算符,从原始数组中切割出所需的子数组 array[start: end:step] ,其中冒号分隔的是范围和增量,获取到从索引start开始到end(不包括end)间的元素。
如果step>0的省略start则从0开始,省略end,则到最后一个元素;
\quad
如果step<0的,省略start从-1开始,省略end到0;如果没有step,则增量为1。如果start到end的方向与step矛盾,则返回[ ]
3. 使用复杂索引获取数组元素
①不仅可以用单个整数值索引来获取元素,还可以给定一个索引列表,获取元素构成新的数组
②使用布尔值屏蔽索引
建立与数组相同形状的布尔数组作为索引,布尔数组元素是True则选择对应的元素,False就不选
五、相关函数
1.形状修改
2.类型修改
3.取整
4.统计相关函数
5.其他
去重np.unique()
深复制np.copy()
连接数组np.concatenate()
.
三角函数np.sin(),np.cos(),np.tan()
.
六、数组间的运算
\quad
涉及的函数大多数除了适用于数组,也适用于列表,元组,数值类型等,但是主要应用于数组。
1.关系运算
2.通用判断函数
np.all(),np.any()
3.三元运算符np.where
4.逻辑运算
5.算术运算
首先明确数组进行算术运算的规则
1. shape相同(同型),对应元素进行运算
2. shape不同,numpy数组广播可以让较小数组扩充到与较大数组相同shape,对应元素进行运算。
广播规则如下:
1) 要求数组是兼容的
兼容的情况:
①数组是相同形状的(同型);
②shape不一样但是ndim一样(同维度数),每一个维度尺寸要么相同要么为1;
③shape不一样且ndim不一样,广播时,较少维度的数组会改变形状,追加维度(往外加一维,即shape往前加元素)且尺寸为1,以便两个数组维度相同,增加维度后的数组,若满足情况②则兼容;
2) 若数组不同维(ndim)不一样,则给低维的数组最加维度,尺寸为1.例如:数组a的形状(4,3),二维;数组b的形状(3,)一维,则将一维数组b扩成二维数组(1,3),注意是往前加一维,而不是往后;
3) 当数组某一维尺寸为1时,其他数组该维大于1时,则尺寸为1的数组会沿着该维复制扩充数组尺寸;
4) 数组在每一维的尺寸是两个数组中的较大值。例如:a是(4,3),b是(1,3)则广播后的数组b的尺寸(当然这是个中间变化,b指向的对象没有变)是(4,3)。
6.遍历
七、向量与矩阵
\quad
向量与矩阵是特殊的数组,向量为一维数组,矩阵为二维数组,它们具有数组的通用性质,线代/高代里的矩阵乘法需要借助np.dot()
和np.matmul()
来完成。