- 课程介绍
- 第⼀部分 基本操作
- 通过key获取保存的数组数据
np.load(‘some_array.npz’)[‘yarr’] - 第⼆部分 数据类型
- 第三部分 数组运算
- 第四部分 复制和视图
- 第五部分 索引、切⽚和迭代
[123, 55, 17, 88, 103]])
arr2d[([1,3],[2,4])] # 相当于arr2d[1,2]获取⼀个元素,arr2d[3,4]获取另⼀个元素
# 输出为 array([ 6, 103]) # 选择⼀个区域
arr2d[np.ix([1,3,3,3],[2,4,4])] # 相 当 于 arr2d[[1,3,3,3]][:,[2,4,4]]
arr2d[[1,3,3,3]][:,[2,4,4]]
# ix()函数可⽤于组合不同的向量
# 第⼀个列表存的是待提取元素的⾏标,第⼆个列表存的是待提取元素的列标
# 输出为- 第六部分 形状操作
- 第七部分 ⼴播机制
- 第⼋部分 通⽤函数
- 第九部分 线性代数
- 矩阵的乘积
A = np.array([[4,2,3],
[1,3,1]]) # shape(2,3)
B = np.array([[2,7],
[-5,-7],
[9,3]]) # shape(3,2)
np.dot(A,B) # 矩阵运算 A的最后⼀维和B的第⼀维必须⼀致A @ B # 符号 @ 表示矩阵乘积运算 - 计算矩阵的逆
from numpy.linalg import inv,det,eig,qr,svd A = np.array([[1,2,3],
[2,3,4],
[4,5,8]]) # shape(3,3)
inv(t) # 逆矩阵
det(t)#计算矩阵⾏列式 - 第⼗部分 实战-⽤NumPy分析鸢尾花花萼属性各项指标
课程介绍
Po,功夫熊猫中阿宝。勤加练习,你就所向披靡!
NumPy(Numerical Python)是Python的⼀种开源的数值计算扩展。提供多维数组对象,各种派⽣对象(如掩码数组和矩阵),这种⼯具可⽤来存储和处理⼤型矩阵,⽐Python⾃身的嵌套列表(nested list structure)结构要⾼效的多(该结构也可以⽤来表示矩阵(matrix)),⽀持⼤量的维度数组与矩阵运算,此外也针对数组运算提供⼤量的数学函数库,包括数学、逻辑、形状操作、排序、选择、输⼊输 出、离散傅⽴叶变换、基本线性代数,基本统计运算和随机模拟等等。
⼏乎所有从事Python⼯作的数据分析师都利⽤NumPy的强⼤功能。强⼤的N维数组
成熟的⼴播功能
⽤于整合C/C++和Fortran代码的⼯具包
NumPy提供了全⾯的数学功能、随机数⽣成器和线性代数功能安装Python库
pip install jupyter -i https://pypi.tuna.tsinghua.edu.cn/simple pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
启动终端
Windows——> 快捷键:win + R ——->输⼊:cmd回⻋ >命令⾏出来
Mac >启动终端
启动jupyter
进⼊终端输⼊指令:jupyter notebook
在哪⾥启动jupyter启动,浏览器上的⽬录,对应哪⾥
第⼀部分 基本操作
第⼀节 数组创建
创建数组的最简单的⽅法就是使⽤array函数,将Python下的list转换为ndarray。
import numpy as np
l = [1,3,5,7,9] # 列 表
arr = np.array(l) # 将列表转换为NumPy数组arr # 数据⼀样,NumPy数组的⽅法,功能更加强⼤# 输出为
# array([1, 3, 5, 7, 9])
我们可以利⽤np中的⼀些内置函数来创建数组,⽐如我们创建全0的数组,也可以创建全1数组,全是其 他数字的数组,或者等差数列数组,正态分布数组,随机数。
import numpy as np
arr1 = np.ones(10) # 输出为:array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
arr2 = np.zeros(10) # 输 出 为 : array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
arr3 = np.full(shape = [2,3],fill_value=2.718) # 输出为:
# array([[2.718, 2.718, 2.718],
# [2.718, 2.718, 2.718]])
arr4 = np.arange(start = 0,stop = 20,step = 2)
# 等差数列 输出为:array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18]) arr5 = np.linspace(start =0,stop = 9,num = 10)
# 等差数列 输出为:array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
arr6 = np.random.randint(0,100,size = 10)
# int随机数 输出为:array([ 4, 8, 79, 62, 34, 35, 2, 65, 47, 18]) arr7 = np.random.randn(5)
# 正态分布 输出为:array([ 0.57807872, 0.37922855, 2.37936837, -0.28688769,
0.2882854 ])
arr8 = np.random.random(size = 5)
# float 随机数 输出为:array([0.59646412, 0.37960586, 0.38077327, 0.76983539,
0.22689201])
第⼆节 查看操作
jupyter扩展插件
pip install jupyter_contrib_nbextensions -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install jupyter_nbextensions_configurator -i https://pypi.tuna.tsinghua.edu.cn/simple
jupyter contrib nbextension install —user
jupyter nbextensions_configurator enable —user
NumPy的数组类称为ndarray,也被称为别名 array。请注意,numpy.array这与标准Python库类不同array.array,后者仅处理⼀维数组且功能较少。ndarray对象的重要属性是
1. **数组的轴数、维度**
import numpy as np
arr = np.random.randint(0,100,size = (3,4,5)) arr.ndim # 输 出 3
1. **数组尺⼨形状**
import numpy as np
arr = np.random.randint(0,100,size = (3,4,5)) arr.shape # 输 出 (3,4,5)
1. **数组元素的总数**
import numpy as np
arr = np.random.randint(0,100,size = (3,4,5)) arr.size # 输 出 345 = 60
1. **数据类型**
import numpy as np
arr = np.random.randint(0,100,size = (3,4,5)) arr.dtype # 输 出 dtype(‘int64’)
1. **数组中每个元素的⼤⼩(以字节为单位)**
import numpy as np
arr = np.random.randint(0,100,size = (3,4,5))
arr.itemsize #输出是 8 ,因为数据类型是int64,64位,⼀个字节是8位,所以64/8 = 8
第三节 ⽂件IO操作
1. **保存数组**
save⽅法保存ndarray到⼀个npy⽂件,也可以使⽤savez将多个array保存到⼀个.npz⽂件中
x = np.random.randn(5) y = np.arange(0,10,1) #save⽅法可以存⼀个ndarray np.save(“x_arr”,x)
#如果要存多个数组,要是⽤savez⽅法,保存时以key-value形式保存,key任意(xarr、yarr) np.savez(“some_array.npz”,xarr = x,yarr=y)
1. **读取**
load⽅法来读取存储的数组,如果是.npz⽂件的话,读取之后相当于形成了⼀个key-value类型的变量, 通过保存时定义的key来获取相应的array
np.load(‘x_arr.npy’) # 直接加载
通过key获取保存的数组数据
np.load(‘some_array.npz’)[‘yarr’]
1. **读写csv、txt⽂件**
arr = np.random.randint(0,10,size = (3,4)) #储存数组到txt⽂件
np.savetxt(“arr.csv”,arr,delimiter=’,’) # ⽂件后缀是txt也是⼀样的
#读取txt⽂件,delimiter为分隔符,dtype为数据类型
np.loadtxt(“arr.csv”,delimiter=’,’,dtype=np.int32)
第⼆部分 数据类型
ndarray的数据类型:
int: int8、uint8、int16、int32、int64 float: float16、float32、float64
str
array创建时,指定
import numpy as np np.array([1,2,5,8,2],dtype = ‘float32’)
# 输 出 :array([1., 2., 5., 8., 2.], dtype=float32)
asarray转换时指定
import numpy as np arr = [1,3,5,7,2,9,0]
# asarray 将列表进⾏变换
np.asarray(arr,dtype = ‘float32’)
# 输 出 :array([1., 3., 5., 7., 2., 9., 0.], dtype=float32)
数据类型转换astype
import numpy as np
arr = np.random.randint(0,10,size = 5,dtype = ‘int16’) # 输 出 :array([6, 6, 6, 6, 3], dtype=int16)
# 使⽤astype进⾏转换
arr.astype(‘float32’) # 输 出 :array([1., 4., 0., 6., 6.], dtype=float32)
第三部分 数组运算
加减乘除幂运算
import numpy as np
arr1 = np.array([1,2,3,4,5])
arr2 = np.array([2,3,1,5,9]) arr1 - arr2 # 减 法
arr1 arr2 # 乘 法
arr1 / arr2 # 除 法
arr1*arr2 # 两个星号表示幂运算
逻辑运算
import numpy as np
arr1 = np.array([1,2,3,4,5])
arr2 = np.array([1,0,2,3,5]) arr1 < 5
arr1 >= 5
arr1 == 5 arr1 == arr2 arr1 > arr2
数组与标量计算
数组与标量的算术运算也会将标量值传播到各个元素
import numpy as np arr = np.arange(1,10) 1/arr
arr+5 arr*5
*=、+=、-=操作
某些操作(例如+=和*=)只会修改现有数组,⽽不是创建⼀个新数组。
import numpy as np arr1 = np.arange(5) arr1 +=5
arr1 -=5 arr1 *=5
# arr1 /=5 不⽀持运算
第四部分 复制和视图
在操作数组时,有时会将其数据复制到新数组中,有时不复制。
完全没有复制
import numpy as np
a = np.random.randint(0,100,size = (4,5)) b = a
a is b # 返回True a和b是两个不同名字对应同⼀个内存对象
b[0,0] = 1024 # 命运共同体
display(a,b)
查看或浅拷⻉
不同的数组对象可以共享相同的数据。该view⽅法创建⼀个查看相同数据的新数组对象
import numpy as np
a = np.random.randint(0,100,size = (4,5)) b = a.view() # 使⽤a中的数据创建⼀个新数组对象
a is b # 返回False a和b是两个不同名字对应同⼀个内存对象
b.base is a # 返回True,b视图的根数据和a⼀样b.flags.owndata # 返回False b中的数据不是其⾃⼰的a.flags.owndata # 返回True a中的数据是其⾃⼰的b[0,0] = 1024 # a和b的数据都发⽣改变
display(a,b)
深拷⻉
import numpy as np
a = np.random.randint(0,100,size = (4,5)) b = a.copy()
b is a # 返回False
b.base is a # 返 回 False b.flags.owndata # 返 回 True a.flags.owndata # 返 回 True
b[0,0] = 1024 # b改变,a不变,分道扬镳
display(a,b)
copy应该在不再需要原来的数组情况下,切⽚后调⽤。例如,假设a是⼀个巨⼤的中间结果,⽽最 终结果b仅包含的⼀⼩部分a,则在b使⽤切⽚进⾏构造时应制作⼀个深拷⻉:
import numpy as np a = np.arange(1e8)
b = a[::1000000].copy() # 每100万个数据中取⼀个数据
del a # 不在需要a,删除占⼤内存的a
b.shape # shape(100,)
第五部分 索引、切⽚和迭代
第⼀节 基本索引和切⽚
numpy中数组切⽚是原始数组的视图,这意味着数据不会被复制,视图上任何数据的修改都会反映到原 数组上
arr = np.array([0,1,2,3,4,5,6,7,8,9])
arr[5] #索引 输出 5
arr[5:8] #切⽚输出:array([5, 6, 7])
arr[2::2] # 从索引2开始每两个中取⼀个 输出 array([2, 4, 6, 8])
arr[::3] # 不 写 索 引 默 认 从 0 开 始 , 每 3 个 中 取 ⼀ 个 输 出 为 array([0, 3, 6, 9]) arr[1:7:2] # 从索引1开始到索引7结束,左闭右开,每2个数中取⼀个 输出 array([1, 3, 5]) arr[::-1] # 倒 序 输 出 array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
arr[::-2] # 倒序 每两个取⼀个 输出 array([9, 7, 5, 3, 1]) arr[5:8]=12 # 切⽚赋值会赋值到每个元素上,与列表操作不同
temp = arr[5:8] temp[1] = 1024
arr # 输 出:array([ 0, 1, 2, 3, 4, 12, 1024, 12, 8, 9])
对于⼆维数组或者⾼维数组,我们可以按照之前的知识来索引,当然也可以传⼊⼀个以逗号隔开的索引 列表来选区单个或多个元素
arr2d = np.array([[1,3,5],[2,4,6],[-2,-7,-9],[6,6,6]]) # ⼆维数组 shape(3,4)
arr2d[0,-1] #索引 等于arr2d[0][-1] 输出 5
arr2d[0,2] #索引 等于arr2d[0][2] == arr2d[0][-1] 输 出 5
arr2d[:2,-2:] #切⽚ 第⼀维和第⼆维都进⾏切⽚ 等于arr2d[:2][:,1:] arr2d[:2,1:] #切⽚ 1 == -2 ⼀个是正序,另个⼀是倒序,对应相同的位置# 输出:
#array([[3, 5],
# [4, 6]])
第⼆节 花式索引和索引技巧
整数数组进⾏索引即花式索引,其和切⽚不⼀样,它总是将数据复制到新数组中
import numpy as np #⼀维
arr1 = np.array([1,2,3,4,5,6,7,8,9,10])
arr2 = arr1[[1,3,3,5,7,7,7]] # 输 出 array([2, 4, 4, 6, 8, 8, 8])
arr2[-1] = 1024 # 修改值,不影响arr1 #⼆维
arr2d = np.array([[1,3,5,7,9],[2,4,6,8,10],[12,18,22,23,37], [123,55,17,88,103]]) #shape(4,5)
arr2d[[1,3]] # 获取第⼆⾏和第四⾏,索引从0开始的所以1对应第⼆⾏
# 输 出 array([[ 2, 4, 6, 8, 10],
[123, 55, 17, 88, 103]])
arr2d[([1,3],[2,4])] # 相当于arr2d[1,2]获取⼀个元素,arr2d[3,4]获取另⼀个元素
# 输出为 array([ 6, 103]) # 选择⼀个区域
arr2d[np.ix([1,3,3,3],[2,4,4])] # 相 当 于 arr2d[[1,3,3,3]][:,[2,4,4]]
arr2d[[1,3,3,3]][:,[2,4,4]]
# ix()函数可⽤于组合不同的向量
# 第⼀个列表存的是待提取元素的⾏标,第⼆个列表存的是待提取元素的列标
# 输出为
# | array([[ | 6, | 10, | 10], |
---|---|---|---|---|
# | [ | 17, | 103, | 103], |
# | [ | 17, | 103, | 103], |
# | [ | 17, | 103, | 103]]) |
boolean值索引
names = np.array([‘softpo’,’Brandon’,’Will’,’Michael’,’Will’,’Ella’,’Daniel’,’softpo’,’ Will’,’Brandon’])
cond1 = names == ‘Will’ cond1
# 输出array([False, False, True, False, True, False, False, False, True,
False])
names[cond1] # array([‘Will’, ‘Will’, ‘Will’], dtype=’<U7’) arr = np.random.randint(0,100,size = (10,8)) # 0~100随机数cond2 = arr > 90
# 找到所有⼤于90的索引,返回boolean类型的数组 shape(10,8),⼤于返回True,否则False arr[cond2] # 返回数据全部是⼤于90的
第六部分 形状操作
数组变形
import numpy as np
arr1 = np.random.randint(0,10,size = (3,4,5)) arr2 = arr1.reshape(12,5) # 形状改变,返回新数组arr3 = arr1.reshape(-1,5) # ⾃动“整形”,⾃动计算
数组转置
import numpy as np
arr1 = np.random.randint(0,10,size = (3,5)) # shape(3,5) arr1.T # shape(5,3) 转 置
arr2 = np.random.randint(0,10,size = (3,6,4)) # shape(3,6,4) np.transpose(arr2,axes=(2,0,1)) # transpose改变数组维度 shape(4,3,6)
数组堆叠
import numpy as np
arr1 = np.array([[1,2,3]])
arr2 = np.array([[4,5,6]]) np.concatenate([arr1,arr2],axis = 0)
# 串联合并shape(2,3) axis = 0表示第⼀维串联 输出为
# array([[1, 2, 3],
# [4, 5, 6]])
np.concatenate([arr1,arr2],axis = 1)
# shape(1,6) axis = 1表示第⼆维串联 输出为:array([[1, 2, 3, 4, 5, 6]])
np.hstack((arr1,arr2)) # ⽔平⽅向堆叠 输出为:array([[1, 2, 3, 4, 5, 6]]) np.vstack((arr1,arr2))
# 竖直⽅向堆叠,输出为:
# array([[1, 2, 3],
# [4, 5, 6]])
split数组拆分
import numpy as np
arr = np.random.randint(0,10,size = (6,5)) # shape(6,5) np.split(arr,indices_or_sections=2,axis = 0) # 在第⼀维(6)平均分成两份np.split(arr,indices_or_sections=[2,3],axis = 1) # 在第⼆维(5)以索引2,3为断点分割成3份
np.vsplit(arr,indices_or_sections=3) # 在竖直⽅向平均分割成3份
np.hsplit(arr,indices_or_sections=[1,4]) # 在⽔平⽅向,以索引1,4为断点分割成3份
第七部分 ⼴播机制
当两个数组的形状并不相同的时候,我们可以通过扩展数组的⽅法来实现相加、相减、相乘等操作,这 种机制叫做⼴播(broadcasting)
⼀维数组⼴播
import numpy as np
arr1 = np.sort(np.array([0,1,2,3]*3)).reshape(4,3) #shape(4,3) arr2 = np.array([1,2,3]) # shape(3,)
arr3 = arr1 + arr2 # arr2进⾏⼴播复制4份 shape(4,3)
arr3
⼆维数组的⼴播
import numpy as np
arr1 = np.sort(np.array([0,1,2,3]*3)).reshape(4,3) # shape(4,3)
arr2 = np.array([[1],[2],[3],[4]]) # shape(4,1) arr3 = arr1 + arr2 # arr2 进⾏⼴播复制3份 shape(4,3) arr3
三维数组⼴播
import numpy as np
arr1 = np.array([0,1,2,3,4,5,6,7]*3).reshape(3,4,2) #shape(3,4,2)
arr2 = np.array([0,1,2,3,4,5,6,7]).reshape(4,2) #shape(4,2) arr3 = arr1 + arr2 # arr2数组在0维上复制3份 shape(3,4,2)
arr3
第⼋部分 通⽤函数
第⼀节 通⽤函数:元素级数字函数
abs、sqrt、square、exp、log、sin、cos、tan,maxinmum、minimum、all、any、inner、clip、round、trace、ceil、floor
import numpy as np
arr1 = np.array([1,4,8,9,16,25]) np.sqrt(arr1) # 开平⽅np.square(arr1) # 平 ⽅
np.clip(arr1,2,16) # 输 出 array([ 2, 4, 8, 9, 16, 16])
x = np.array([1,5,2,9,3,6,8])
y = np.array([2,4,3,7,1,9,0])
np.maximum(x,y) # 返回两个数组中的⽐较⼤的值arr2 = np.random.randint(0,10,size = (5,5)) np.inner(arr2[0],arr2) #返回⼀维数组向量内积
第⼆节 where函数
where 函数,三个参数,条件为真时选择值的数组,条件为假时选择值的数组
import numpy as np
arr1 = np.array([1,3,5,7,9])
arr2 = np.array([2,4,6,8,10])
cond = np.array([True,False,True,True,False]) np.where(cond,arr1,arr2) # True选择arr1,False选择arr2的值# 输 出 array([ 1, 4, 5, 7, 10])
arr3 = np.random.randint(0,30,size = 20)
np.where(arr3 < 15,arr3,-15) # ⼩于15还是⾃身的值,⼤于15设置成-15
第三节 排序⽅法
np中还提供了排序⽅法,排序⽅法是就地排序,即直接改变原数组arr.sort()、np.sort()、arr.argsort()
import numpy as np
arr = np.array([9,3,11,6,17,5,4,15,1])
arr.sort() # 直接改变原数组
np.sort(arr) # 返回深拷⻉排序结果
arr = np.array([9,3,11,6,17,5,4,15,1])
arr.argsort() # 返回从⼩到⼤排序索引 array([8, 1, 6, 5, 3, 0, 2, 7, 4])
第四节 集合运算函数
A = np.array([2,4,6,8])
B = np.array([3,4,5,6]) np.intersect1d(A,B) # 交 集 array([4, 6])
np.union1d(A,B) # 并 集 array([2, 3, 4, 5, 6, 8])
np.setdiff1d(A,B) #差集,A中有,B中没有 array([2, 8])
第五节 数学和统计函数
min、max、mean、median、sum、std、var、cumsum、cumprod、argmin、argmax、argwhere、cov、corrcoef
import numpy as np
arr1 = np.array([1,7,2,19,23,0,88,11,6,11])
arr1.min() # 计 算 最 ⼩ 值 0 arr1.argmax() # 计算最⼤值的索引 返回 6
np.argwhere(arr1 > 20) # 返回⼤于20的元素的索引
np.cumsum(arr1) # 计算累加和
arr2 = np.random.randint(0,10,size = (4,5)) arr2.mean(axis = 0) # 计算列的平均值arr2.mean(axis = 1) # 计算⾏的平均值np.cov(arr2,rowvar=True) # 协⽅差矩阵np.corrcoef(arr2,rowvar=True) # 相关性系数
第九部分 线性代数
矩阵乘积
矩阵的乘积
A = np.array([[4,2,3],
[1,3,1]]) # shape(2,3)
B = np.array([[2,7],
[-5,-7],
[9,3]]) # shape(3,2)
np.dot(A,B) # 矩阵运算 A的最后⼀维和B的第⼀维必须⼀致A @ B # 符号 @ 表示矩阵乘积运算
矩阵其他计算
下⾯可以计算矩阵的逆、⾏列式、特征值和特征向量、qr分解值,svd分解值
计算矩阵的逆
from numpy.linalg import inv,det,eig,qr,svd A = np.array([[1,2,3],
[2,3,4],
[4,5,8]]) # shape(3,3)
inv(t) # 逆矩阵
det(t)#计算矩阵⾏列式
第⼗部分 实战-⽤NumPy分析鸢尾花花萼属性各项指标
案列:读取iris数据集中的花萼⻓度数据(已保存为csv格式)
并对其进⾏排序、去重,并求出和、累积和、均值、标准差、⽅差、最⼩值、最⼤值。
import numpy as np # 导⼊类库 numpy
data = np.loadtxt(‘./iris.csv’,delimiter = ‘,’) # 读取数据⽂件,data是⼆维的数组
data.sort(axis = -1) # 简单排序
print(‘简单排序后:’, data)
print(‘数据去重后:’, np.unique(data)) # 去除重复数据print(‘数据求和:’, np.sum(data)) # 数 组 求 和print(‘元素求累加和’, np.cumsum(data)) # 元素求累加和print(‘数据的均值:’, np.mean(data)) # 均 值print(‘数据的标准差:’, np.std(data)) # 标准差print(‘数据的⽅差:’, np.var(data)) # ⽅ 差
print(‘数据的最⼩值:’, np.min(data)) # 最⼩值
print(‘数据的最⼤值:’, np.max(data)) # 最⼤值