导图社区 科学计算库numpy
这是一篇关于科学计算库numpy的思维导图,包括numpy初始化、numpy数据类型、形状操作等内容。
编辑于2021-08-20 09:22:03科学计算库numpy
1. numpy是什么
简介:NumPy 是一个功能强大的 Python 库,主要用于对多维数组执行计算
特点
numpy 内置了并行运算功能,当系统有多个核心时,做某种计算时,numpy 会自动做并 行计算
Numpy 底层使用 C 语言编写,内部解除了 GIL(全局解释器锁),其对数组的操作速度不受Python 解释器的限制,效率远高于纯 Python 代码。
有一个强大的 N 维数组对象 Array(一种类似于列表的东西)
实用的线性代数、傅里叶变换和随机数生成函数
Numpy 数组中的元素必须是同一类型
2. numpy初始化
np.array(x)
参数 x 是一个数组,这种实例化方式适用于数组已知的情况,直接把已知数组放入函数中即可创 建
np.arange(x,y,z)
x 是最小值,y 是最大值,z 是步长。也就是说这个函数会创建一个等差数列样式、一维数组样 式的 np 对象
np.random
np.random.random(x):随机生成一个 x 形状的,并且数组元素在 0 到 1 之间的数组。参数 x 是一个元组,代表的是生成的 np 数组的形状
np.random.randint(x,y,size=z):,x 是最小值,y 是最大值,z 是一个元组,代表形状。随机生成 一个数组元素在 x 和 y 之间的 z 形状数组
特殊数组
np.zeros((2,2)):生成一个两行两列、数组元素全是 0 的数组
np.ones((2,2)):生成一个两行两列、数组元素全是 1 的数组
np.full((2,2),8):生成一个两行两列、数组元素全是 8 的数组
np.eye(3):生成一个三行三列、左上到右下对角线上是 1,其余全是 0 的数组
3. numpy的数据类型
数据类型汇总
子主题
数据类型操作
查看
Array.dtype
设置
在进行数组实例化时有一个参数是 datatype,可以进行数组类型的设置,例如: np.array([1,2,3],dtype = 'int16')
修改
Array.astype('string_')
4. 多维数组操作
1、nparray.ndim 查看数组维数
2、Nparray.shape 查看数组形状
3、nparray.reshape(2,3) 修改数组形状
4、nparray.size 查看数组中元素的个数
5、nparray.flatten()把多为数组变为一维数组
5. 数组的切片和索引
一维数组
索引
a1[4]:索引从 0 开始,这里是取出索引为 4 的元素
切片
a1[x:y:z],从x开始取到y结束(不包含y),z是步长,如果z为-1,则表示倒叙打印 例如:a1[0:10:2] 取出所有偶数 a1[10:0:-1] #倒叙打印
二维数组
索引
规则:以二维数组来举例,[x,y]以“,”来区分行和列,前面的 x 是行,后面的 y 是列
1、取出单个单独的元素 例子:a[3,4]取出第四行第五列的元素
2、取出多个单独的元素 例子:a1[[2,4],[3,5]] 取出第 3 行第 4 列和第 5 行第 6 列的数据
3、取出单独的行或列 例子:(a1[0]) #取出第一行数据
例子:a1[[2,4]]) 取多个不连续的行 a1[:,[3,5]]) 取出多个不连续的列
切片
1、取出连续的行
a1[1:3]:取出第一行到第二行
2、取出连续的列
a1[:,1:3]:取出第一列到第二列
3、取出二维数组的一块(连续的一部分)
a1[[2,4],[3,5]]:取出第 3 行第 4 列和第 5 行第 6 列的数据
4、规律取出行或者列
a1[1:6:2]
布尔索引
a1>10:返回的是一个和原数组形状一样的数组,但是元素只有 True 和 Fales
a1[((a1<10) & (a1>5))]:取出数组中大于5小于10的元素。返回值是一个一维数组
修改数组的值
使用索引和切片将数组要修改的元素取出来之后,直接赋新值即可
np.where(a,b,c):a 是一个条件表达式,如果元素符合条件表达式,那么就把元素换成 a, 否则换成 b。Npwhere()并不会修改元数组中的值,而是返回一个新的数组
6. 数组广播机制
广播机制:两个数组进行加减乘除运算,如果维度相同,那么直接进行对位相加减即可;如果维 度符合上面的运算原则,那么就要发挥广播机制,使维度为 1 的进行扩展,比如有一个(4,1)乘 以(4,3)的数组那么,(4,1)的数组会进行扩展,扩展成(4,3),扩展的第二列、第三列都是复制的 第一列的值,然后两个数组在进行对位相乘
数组与数的运算
规则:当数组与数进行运算时,数组中的每个元素会执行统一的操作。比如数组乘以一个数,那么数组 里的每个元素都会和这个数相乘,每个形成的结果组合成一个新的数组,这个数组就是数组与数 相乘的结果
数组与数组的运算
运算原则:从数组的末尾维度算起,如果两个数组的末尾维度相同或者有一方是 1,按照这个规则往前推,如果都符合规则,那么是可以相加的。 举例:(3,3,1)和(3,4)的两个数组,先看两个数组的末尾元素是 1 和 3,符合规则;那么再 往前看,3 和 3 还符合规则,那么这两个数组便是可以相加的
7. 形状操作
reshape()和resize()
区别:reshape 和 resize 都是改变数组形状,但是 reshape 不改变原数组形状,resize 则会改变
a1.reshape((4,3))
a1.resize((4,3))
flatten() 和 ravel()
区别:flatten 和 ravel 都是把多维数组转换成 1 维数组,但是 flatten 和 ravel 不会改变原数组形状, 但是当修改 ravel 的值时会修改原数组的值,但是 flatten 不会修改原数组:
a1.flatten()
a1.ravel()
数组拼接操作
vstack 是在垂直方向上叠加
np.vstack([vstack1,vstack2])
hstack 是在水平方向上叠 加
np.hstack([hstack1,hstack2])
concatenate(a,b,axis)这也是数组拼接,但是具体拼接方向看 axis 的值:0:垂直,1:水平, None:融合为一个 1 维数组
np.concatenate([c1,c2],axis=0)
数组切割
vsplit
hsplit
split
规则:Nparray.split(x,y),x 是需要被分割的数组,y 可以是一个数字,也可以是一个元 组;如果是一个数子,那么代表原数组要被平均分成 y 份,如果是一个元组,那 么数组会按照元组所给的数组进行分割,比如 y 是(2,4),那么 y 将会从第二行与 第三行之间切一刀,第四行和第五行之间切一刀,把数组分成 3 部分。vsplit 和 hsplit 的参数和 split 相同
np.split(a,(2,3),axis=0):垂直切割
np.split(a,(1,2),axis=1):水平切割
数组的转置
ndarray.T
ndarray.transpose()
ndarray.T 和 ndarray.transpose()都是数组的转置,区别是前者是拷贝,后者是视图(修改转 置后的数组会影响原数组),拷贝后修改不影响原数组,视图修改会影响原数组
8. 拷贝
解释:在创建一个数组的时候,一般会在栈区开辟一个空间 存储对象名称以及指向堆区数据的信息,堆区会开辟一个空间存储数据。深拷贝是堆区和栈区都 拷贝,这种比较常见; 浅拷贝是只拷贝栈区不拷贝堆区,比如说某些函数创建视图,视图就是 浅拷贝;不拷贝是都不拷贝,只是相当于在栈区中对原数组的名称起别名
不拷贝
对应函数:
浅拷贝
对应函数:
深拷贝
对应函数:
9. csv 文件操作
np.savetxt()和 np.loadtxt()
np.savetxt('./文件/score.csv',a,delimiter = ',',header='语文,数学',comments='',fmt='%d') #fmd:数据类型
np.loadtxt('文件/score.csv',dtype='int',delimiter=',',skiprows=1)
np 独有的文件操作函数
np.save()
np.savez()
np.load()
10. random模块
11.1 np.random.seed()的作用:random每次产生的随机数都是不固定,当在seed中给出一个值之后,不管random运行多少次,每次的结果都会是一样的。如果不给seed值,那么random会根据系统时间生成随机数
np.random.rand()产生一个0到1之间的随机数。参数是一个元组,表示形状
np.random.randn() 生一个标准差为1,平均值为0的标准正态分布值,randn()里面可以放参数,参数表示生成数组的大小
np.random.randint() 生成随机整数
np.random.choice() 从指定数组和列表中进行随机取数 numpy.random.choice(a, size=None, replace=True, p=None) 从a(只要是ndarray都可以,但必须是一维的)中随机抽取数字,并组成指定大小(size)的数组
np.random.shuffle()打乱数组中元素的位置,此函数没有返回值,直接在原数据上打乱的