一、Numpy介绍
1 定义
Numpy是一个开源的python科学计算库。使用Numpy可以方便的使用数组、矩阵进行计算,它包含线性代数、傅里叶变换、随机数生成等大量函数。
2 优势
-- 代码更简洁:Numpy直接以数组、矩阵为粒度计算并支撑大量的数学函数,而Python需要用for循环从底层实现;
-- 性能更高效:Numpy的数组存储效率和输入输出计算性能,比Python使用List或嵌套List好很多。
3 使用Python原生代码和Numpy对比
# 使用python原生代码实现两个数组相加的计算
def python_sum(n):
'''
原生python实现两个数组的相加
'''
# 使用列表生成式创建1到n的平方
a = [i**2 for i in range(n)]
# 使用列表生成式创建1到n的平方
b = [i**3 for i in range(n)]
# 新创建新列表
ab_sum=[]
# 循环a的索引
for i in range(n):
# 将a中对应元素与b中对应元素相加
ab_sum.append(a[i]+b[i])
return ab_sum
# 使用Numpy实现两个数组的相加
def numpy_sum(n):
'''
使用Numpy实现两个数组相加
'''
a = np.arange(n)**2
b = np.arange(n)**3
return a+b
对比:
通过一个简单地例子可以看出:使用Numpy可以使代码更简洁,并且运行效率更高。
二、Numpy创建数组
1 基本语法
numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)
2 参数解释
-- object :表示一个数组序列
-- dtype :可选参数,通过它可以更改数组的数据类型
-- copy :可选参数,当数据源是ndarry时表示数组能否被复制,默认为True
-- order :可选参数,以哪种内存布局创建数组,又是哪个可选值,分别是C(行序列)、F(列序列)和A(默认)
-- ndmin :可选参数,用于指定数组的维度
-- subok :可选参数,类型为bool值,默认为False。为True时,使用object的内部数据类型,为False时,使用object数组的数据类型
3 复制时应注意
b = a 和 b = np.array(a)的区别:
如果直接使用b=a,是试图操作,相当于引用赋值,会使a和b使用的是同一内存地址,而使用 b = np.array(a),a和b是使用的不同的地址,具体如下:
直接使用b = a方式:
使用b = np.array(a)方式:
另外可以使用copy函数复制:
4 arange()生成区间数组
基本语法:
numpy.arange(start,stop,step,dtype)
参数说明:
-- start :起始值,默认为0
-- stop :终止值(不包含)
-- step :步长,默认为1
-- dtype :返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型
range和arange使用:
起始参数start是一个可选参数,默认就为0,但是在使用时要注意,当起始值为0且步长不是1时的书写。
现要输出从0到20,步长为3的数组如下演示:
5 linspace()创建等差数列
基本语法:
np.linspace(start,stop,num=50,endpoint=True,retstep=False,dtype=None)
参数说明:
-- start :必填项,序列的起始值
-- stop :必填项,序列的终止值,如果endpoint为True,该值包含于数列中
-- num :要生成的等步长的样本数量,默认为50
-- endpoint:该值为True时,数列中包含stop值,否则不包含,默认为True
-- retstep :如果为True时,生成的数组中会显示间距,反之不显示
-- dtype :ndarray的数据类型
6 logspace()创建等差数列
基本语法:
np.logspace(start,stop,num=50,endpoint=True,base=10.0,dtype=None)
参数说明:
-- start :必填项,序列的起始值
-- stop :必填项,序列的终止值,如果endpoint为True,该值包含于数列中
-- num :要生成的等步长的样本数量,默认为50
-- endpoint:该值为True时,数列中包含stop值,否则不包含,默认为True
-- base :对数log的底数
-- dtype :ndarray的数据类型
示例:
解释:
np.logspace(0,9,10,base=2) 表示:从0到9分成10等份,然后以2为底进行次方运算。
7 全0数列
基本语法:
numpy.zeros(shape,dtype=float,order='C')
参数说明:
-- shape :数组形状
-- dtype :数组类型,可选
几种常用的创建方式:
全1数列和全0数列使用基本一致:
8 Numpy数组属性
常用属性:
-- numpy.ndim :秩,即轴的数量或维度的数量
-- ndarray.shape :数组的维度,对于矩阵,n行m列
-- ndarray.size :数组元素的总个数,相当于.shape中n*m的值
-- ndarray.dtype :ndarry对象的元素类型
-- ndarray.itemsize :ndarray对象中每一个元素的大小,以字节为单位
属性shape演示:
使用reshape调整维度:
使用resize调整维度:
属性ndim演示:
属性size演示:
使用astype改变数组数据类型:
属性itemsize演示:
三、数组操作
1 一维数组切片和索引
numpy对象的内容可以通过索引或切片来访问和修改,与python中list的切片操作一样。
注意:数组切片是原始数组视图,若不想更改原始数组,要进行显示的复制:
基本语法:
[start:stop:step]
参数说明:
如果只有一个参数:如[2]表示返回与该索引相对应的单个元素。
如果只有一个参数:如[2:]表示从该索引开始以后的所有项都会被提取
如果只有一个参数:如[:7]表示从开始直到该索引的所有项会被提取
如果有两个参数,如[2:7]表示提取索引两个数之间所有项(不包括停止项)
当步长step为-1时,表示反方向取
2 多维数组切片和索引
取出第二列的所有元素:
取出第二列之后的所有列中元素:
返回第三行第四列元素的两种方式:
arr3[2,3]和arr3[2][3]两种表达方式都取到了二维数组中第三行第四列的元素,但是理解上还是有区别的:
arr3[2,3]表示取第三行和第四列交叉的那个元素,而arr3[2][3]表示,先取出数组的第三行,即arr = arr3[2],
然后再取出该行中第四个元素,即取出的是arr[3]
arr3[...,1]和arr3[...][1]是有区别的:
取出数组中指定的几个元素:
可以选择取出某几行和几列:
3 布尔数组索引
取出所有大于6的元素:
将数组中所有奇数改为-1:
通过布尔值控制去除条件:
4 广播机制
Numpy设计了一种广播机制,这种机制的核心是对形状较小的数组在横向或纵向上进行一定次数的重复,使其与
形状较大的数组拥有相同的维度。
广播的规则:
-- 让所有输入都想其中形状最长的数组看齐,形状中不足的部分都通过在前面加1补齐;
-- 输出数组的形状是输入数组形状的各个维度上的最大值;
-- 如果输入数组的某个维度和输出数组的对应维度的长度相同,或者其长度为1时,这个数组能够用来计算,否则出错;
-- 当输入数组的某个维度的长度为1时,沿着此维度运算时都用此维度上的第一组值。
简单理解:
将两个数组的维度大小右对齐,然后比较对应维度上的数值;
如果数值相等,或其中一个为1或空,则可以进行广播运算;
输出的维度大小为取数值大的数值,否则不能进行数组运算。