Numpy教程
Luo zerone 菜菜子

写在前面

这里只是把一些Numpy的基本的使用语法记录下来了,并没有详细的解释啥的,仅仅作为笔记使用,之后有时间会慢慢修改补充的。

Numpy
  • Numpy是一种高效运算工具
  • Numpy的基本数据结构是ndarray,其实就是数组:smile:
  • ndarray 只存储同一类型的数据,也就是说你并不能在一个变量中既存储字符有存数字,这点和数组一样
  • Numpy专门针对ndarray进行了优化,所以比python的list操作更快,底层是用C语言编写,内部解除了GIL(全局解释器锁)

定义ndarray数组

1
2
3
4
5
6
7
8
9
10
11
12
import numpy as np
ndarray = np.array([[1,2,3],[1,2,3],[4,5,6]])

a = [1,2,3]
b = [ [1,2,3] , [3,4,5] ]
c = [ [ [1,2,3] , [9,7,5] ], [ [1,2,5] , [6,4,2] ] ]
np.array(a) # 一维数组
np.array(b) # 二维数组 两行三列
np.array(c) # 三维数组 两页两行三列

mat = np.array((1,2,3,4,5))
mat.shape # mat其实是一维列数组,只是看起来像是行数组,使用shape就可以发现mat的行数是5

ndarray的复制

1
2
3
4
5
6
7
8
9
np.array()        # 深拷贝
np.asarray() # 浅拷贝 当原数据改变时,此数据也会变
np.copy() # 深拷贝

data = np.array([1,2,3,4,5])
x = np.array(data)
y = np.asarray(data)
z = np.copy(data) # z = data.copy()
# 当修改data数据后,array和copy并不会随着data变化,而asarry却会随着data同时变化,可以理解为asarry复制的是data存放的地址,而array和copy是复制的数值

示例:当修改data中的数据后,x,z都不变,而y却发生了改变

image-20211116223854642

常用属性

1
2
3
4
ndarray.shape    # ndarray类型的数组的行列数
ndarray.size # 数组的总的元素个数
ndarray.ndim # 数组维数
ndarray.dtype # ndarray值的类型 也可以在ndarray定义的时候指定数据类型

生成特殊的数组

1
2
np.ones((3,4))              # 生成3行4列,元素都为1的数组
np.zeros([3,4],dtype="int64") # 生成3行4列,元素都为0的数组, 数据类型是int64
1
2
3
4
5
6
data1 = np.random.rand(100,1)    # 参数是行,列 返回100行1列的数组,单个元素取值0-1之间,且满足均匀分布
data2 = np.random.randn(10,1) # 参数是行,列 返回几行几列的数组,数据满足正态分布
data3 = np.random.randint(1,10,100) # 返回100个数,每个数都是1-9之间的整数,如果没有第三个参数就只返回一个值

"""需要注意的是,如果括号中参数数量,导致结果的区别"""
# 如果无参数,则返回一个常数值,如果是一个参数,则返回一个只有一个值的列表,如果是两个参数,则返回的是二维数组
1
2
3
# 生成固定范围的随机的一维数组
np.linspace(1,10,20) # 生成1-10内20个等间距的数
np.arange(1,10,2) # 和range一个作用,起始位置,终止位置,步长
1
2
3
4
# para1:最小值;para2:最大值,para3:取值数量   所生成的100个数据服从均匀分布
np.random.uniform(1,3,100)
# para1:均值;para2:方差,para3:取值数量 所生成的3行4列的数据服从正态分布
np.random.normal(0,1,(3,4))

索引、切片

1
2
3
4
data = np.random.normal(loc=0,scale=1,size=[8,10])
data[0,0:3] # 第0行的第0列,第1列,第2列数据
data[:,:3] # 所有行的前三列
data[1,1] # 第1行第1列数据 和数组的索引方式一样

修改ndarray的形状

1
2
3
data.reshape(10,8)  # 将8行10列的数据 转成了10行8列的数据,返回新的数据,并不会修改原始数据,如果将参数设为-1,那么
data.resize(10,8) # 将8行10列的数据 转成了10行8列的数据,不返回值,在原始的数据上进行修改
data.T # 矩阵转置

ndarray数据类型修改

1
data.astype("int32")    # 改成int型数据data.tostring()			# 转成字符串型数据

ndarray去重

1
2
np.unique(data)     # 删除所有重复的数据,并将未被删除的的数据往前填充空位 
# set方法也能去重,但是只能用于一维数组

ndarray运算

逻辑运算

1
2
3
4
5
6
data = np.random.normal(0,1,(8,10))         
# 生成数据
# 逻辑判断,如果数值大于某个值判为true,小于就判为false
data = data>0.5 # 判断函数
np.all(data) # 当所有数据都为True时,才返回True 如果数据中只要有一个false就返回false
np.any(data) # 也可以data.any();只要有一个True就返回true,全是false才会返回false

image-20211116225934077

image-20211116230202529

布尔索引

1
2
# 布尔索引,找出data中所有大于0.5的数据data[data>0.5]# 找出data中所有大于0.5的数据,令它们都为2
data[data>0.5]=2

三元运算符

1
2
np.where(data>1,1,0)       
# parameter1: 判断条件 parameter2:满足判断条件后执行的语句 parameter3:不满足判断条件后执行的语句

统计运算

1
2
3
4
5
6
# 统计运算    最小值,max,mean,median
data = np.random.normal(0,1,(8,10))np.max(data) # 或者data.max() data中的最大值
data.max(axis=1) # axis修改轴,每列的最大值
data.max(axis=0) # 每行的最大值
np.mean(data,axis=1) # data的均值
np.argmax(data) # 返回最大值所在的位置

判断函数

1
2
np.all(data)       # 当所有数据都为True时,才返回True   如果数据中只要有一个false就返回false
np.any(data) # 只要有一个True就返回true,全是false才会返回false

数组与数的运算

1
2
3
data +1      # data数组中所有的元素 +1
data*2 # data数组中所有的元素 *2
data/2

广播机制

广播机制其实不难,不过看视频可能更加详细、形象 B站视频链接

1
2
3
data +1      # data数组中所有的元素 +1
data*2 # data数组中所有的元素 *2
data/2

矩阵运算

​ 两种方法存储矩阵

​ 1.ndarray

​ 2.matrix

1
np.mat([80,86])    # matrix存储

矩阵运算

1
a = np.matrix([[1,2,3,4],[2,3,4,5]])b = np.matrix([[1],[2],[3],[4]])a*ba+ba= [[1,0],[0,1]]inv = np.linalg.inv(a)

image-20211116225616989

矩阵/数组合并

1
2
3
4
5
6
a = np.array([[1,2,3],[4,5,6]])
b = np.array([[0,9,8],[9,8,7]])
data1 = np.hstack((a,b)) # 水平合并 h:horizon
data2 = np.vstack((a,b)) # 垂直合并 v:vertical
x = np.c_[a,b] # 矩阵左右进行堆叠 hstack []而不是()
y = np.r_[a,b] # 矩阵上下进行堆叠 vstack

image-20211116224930113

image-20211116225101382

  • 本文标题:Numpy教程
  • 本文作者:Luo zerone
  • 创建时间:2022-05-09 22:32:28
  • 本文链接:http://zer-one.github.io/2022/05/09/numpy/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!