前言
首先需要提前引入Numpy库
import numpy as np
一、基本用法
1.数组的创建
数组创建有:np.array()、np.arange()、np.linspace()、np.logspace()、np.zeros()、np.ones()、np.eye()、np.diag()这八种常用方式。
array()方式
arr1 = np.array([1,2,4,6,9])
arr2 = np.array([-9,3,49,5],dtype = 'str')
#浮点数型
arr2 = np.array([-9,3,49,5],dtype = 'float')
#二维数组,嵌套列表/元组方式
arr3 = np.array([[1,2,3],[55,8,7],[4,6,8]])
arange()方式
#左开右闭,取不到10,步长0.3
np.arange(0,10,0.3)
linspace()方式
产生一个等差数列
#等差数列,初始值为1,终止值为10,总共有10个数的等差数列,步长其自己计算
np.linspace(1,10,10)
#最后一个值不取到(产生11个等差数列,扔掉最后一个)
np.linspace(1,10,10,endpoint = False)
logspace()方式
产生等比数列
#等比数列。先产生一个等差数列,再以2最为底
np.logspace(1,5,base=2,num=10)
与2 ** np.linspace(1,5,10)
结果一样
产生矩阵
产生0矩阵:np.zeros([4,5])#全是0的矩阵,4行5列
产生单位矩阵:np.ones([6,7])#全1矩阵,6行7列
产生只有对角线有值的矩阵:np.eye(6)#6行6列,对角线为1
对角线指定值:np.diag([4,5,8])
当然,这些都可以直接加数字,例如+1:
2.数组的属性
查看数组的维数:.ndim
查看数组有几行几列:.shape
查看数组总共有多少元素:.size
查看数组的数据类型:.dtype
3.索引和切片
即 按照需求取数组
arr = np.arange(1,10)
arr[0]#取第一位
arr[-1]#取最后一位
arr[3:5]#注意是左开右闭的
arr[::-3]#倒序,取到倒数的第三位,结果是array([9,6,3])
arr[-4:-2]#从倒数第四位,还是右边取不到,结果6,7
如果把数组直接赋给另一个,那么新数组的改变将导致原数组的改变:
但是很多时候我们不希望原数组发生改变,故使用.copy()
方法
发现原数组不改变了。
二、二维数组
1.二维数组的学习
也可以先定义数据再创建数组
data2 = ((8,7,6,5,4,5),(4,5,6,7,9,7),(3,4,5,6,8,6))
arr2 = np.array(data2)
索引
arr2[2]#第三行
#第三行第二列
arr2[2,1]
arr2[2][1]
arr2[:,2:4]#行不做限制,取第二列和第三列
arr2[1:3]#第二行到第3行
arr2[arr2>5]#找满足条件的,注意然后就变成一维数组了
查看对条件的满足情况:
2.花式索引
arr2[[2,1]]#曲第三行和第二行,以列表形式
arr2[[2,1],[0,1]]#第3行第1列的元素和第2行第2列的元素
arr2[:,[3,1]]#对行数不做限制,要第四列和第二列,循序也是4,2
arr2[:,1]#一维输出
arr2[:,[1]]#二维输出
arr2[np.ix_([0,-1],[0,2,1])]
np.ix_([0,-1],[0,2,1])#第一行和最后一行,第一列,第三列和第二列
arr2[[0,-1]][:,[0,1,3]]
一维输出的情况
二维的情况
三、Numpy的高级用用法
1.数组形状改变
reshape()
reshape 改变数组的形状但是不改变数据的值
原数组arr2为3行6列的二维数组
改变形状也只能在行列相乘=18的基础上改变
arr2.reshape(6,3)
但是原数组没有改变
.ravel()
把数组将为一维数组,可以是横着降也可以是竖着降
arr2.ravel()
arr2.ravel(order = 'F')#竖着来降为1维
同样也都不改变原数组
.flatten()
用法和.ravel()一样
都可以arr2.flatten()[1]
这种形式索引
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210124170058455.png)
2.数组的ufunc广播机制
创建两个新的数组:
数组合并
#横向合并,要求行数一样
np.hstack((arr1,arr2))
np.concatenate((arr1,arr3),axis=1)#沿着列的方向操作—,axis=0沿着行的方向操纵|
#纵向合并,要求列数一样,行数没关系
np.vstack((arr1,arr3))
#或者
np.concatenate((arr1,arr3),axis=0)
复制:
arr4 = np.array([[0,1],[4,3]])
#复制4次,沿着行的方向复制1次,沿着列方向复制10次
np.tile(arr4,(1,10))
广播机制
要么行数相等要么列数相等
创建二维数组arr5
arr1+arr5
arr1-arr5
是自动把剩余的列给补齐了在相加的。
或者使用函数:
np.add()#把两个数组进行加和,仅支持两个数组,多了的话:
np.add(arr1,np.add(arr2,arr3))
np.subtract(arr1,arr5)#减法运算
np.power(arr1,3)#arr1的三次方
效果都是一样的
乘除也是这么使用。* /
去重,比较运算
s = np.array([1,2,3,4,3,1,2,2,4,6,7,2,4,8,4,5])
test = [2,4,6]
np.unique(s)#去重的
np.in1d(s,test)#s的每个元素是否在test里面,in1d,不是inld
np.intersect1d(test,s)#∩交集
# 比较运算
arr1 = np.array([[0,20,4],[4,5,66],[4,5,60],[55,22,45]])
arr2 = np.array([1,23,4])
# =
arr1 == arr2
np.equal(arr1,arr2)
#>
np.greater(arr1,arr2)
arr1 > arr2
# 逻辑运算
np.greater(arr1,arr2).any()#只要有一个为真就返回真
np.greater(arr1,arr2).all()#所有都为真才返回真
3.排序与搜索
排序
np.sort(s)#返回的是排序完的结果
sorted(s)#返回列表
升序降序排序