第一章 :Jupyter Notebook
与pycharm类似,编写python代码
本质是Web应用程序
01.启动
①Anaconda Prompt
—>jupyter notebook
②Jupyter Notebook
(代码不存放在C盘不建议使用)
③长按Shift+鼠标右键 —>终端打开 —>jupytr notebook
(推荐)
02.编辑模式,命令模式
·编辑模式:允许向单元键中写入代码或文本,单元框为绿色
·命令模式:键盘输入运行程序命令,单元框为蓝色
03.快捷键
• Shift + Enter
: 运行本单元,选中下个单元
• Ctrl + Enter
: 运行本单元
• Alt + Enter
: 运行本单元,在其下插入新单元
• Y
: 单元转入代码状态
• M
: 单元转入markdown状态
• A
: 在上方插入新单元
• B
: 在下方插入新单元
• DD
: 删除选中的单元
• Ctrl + A
: 全选
• Ctrl + Z
: 撤销
• Ctrl + C
: 复制
• Ctrl + V
: 粘贴
• Ctrl + /
: 注释或取消注释
04.帮助文档和自动补全
帮助文档 help(函数)
或者 函数?
自动补全 tab
:代码补全或缩进
05.魔法命令%run
先建文件myscript.py
def square(x):
return x**2
for N in range(1,4):
print(N,"squared is",square(N))
再在输入框中写%run myscript.py
或者import myscript
可以直接运行,或调用函数啦
输入框中有多条命代码时,只会运行最后一条
想要运行多条代码的解决方法:
①逗号分隔法
变量接收
变量间用逗号隔开
eg.
a = square(5)
b = square(6)
a,b
运行结果:(25, 36)
ps:用元组接收结果
②display()
法
变量接收
display(变量1,变量2,...)
eg.a = square(5)
b = square(6)
display(a,b)
运行结果:
25
36
③print()
法
变量接收
print(变量1,变量2,...)
eg.
a = square(5)
b = square(6)
print(a,b)
运行结果:25,36
06. %time&%timeit
①%time :一般用来统计耗时较长代码的运行时长
语法:%time 代码
eg.%time square(1000)
运行结果:0ns
②%timeit:会多次运行代码,得到一个更为准确的运行时间,一般用来统计耗时较短代码的运行时长
语法:%timeit 代码
eg.%timeit square(100)
运行结果:281 ns ± 2.35 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
控制运行时间
eg.%timeit -r 2 -n 1000 square(100)
运行结果:386 ns ± 13.8 ns per loop (mean ± std. dev. of 2 runs, 1000 loops each)
③多行代码查看运行时间
语法:
%%timeit
代码1
代码2
eg.
%%timeit
square(100)
add(10, 20)
运行结果:345 ns ± 4.33 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
07.其他魔法命令
①%who:快速查看当前会话的所有变量与函数名称
语法:%who
eg.%who
运行结果:N a add b square
②%whos:查看当前会话的所有变量与函数名称的详细信息
语法:%whos
eg.%whos
运行结果:
Variable Type Data/Info
--------------------------------
N int 3
a int 25
add function <function add at 0x000001F93BF82158>
b int 36
square function <function square at 0x000001F93C0ACF28>
③%who_ls:以列表形式显示当前会话的函数,变量
语法:%who_ls
eg.%who_ls
运行结果:['N', 'a', 'add', 'b', 'square']
④列出所有魔法命令
语法:Ismagic
eg.lsmagic
运行结果:
Available line magics:
%alias %alias_magic %autocall %automagic %autosave %bookmark %cd %clear %cls %colors %config %connect_info %copy %ddir %debug %dhist %dirs %doctest_mode %echo %ed %edit %env %gui %hist %history %killbgscripts %ldir %less %load %load_ext %loadpy %logoff %logon %logstart %logstate %logstop %ls %lsmagic %macro %magic %matplotlib %mkdir %more %notebook %page %pastebin %pdb %pdef %pdoc %pfile %pinfo %pinfo2 %popd %pprint %precision %profile %prun %psearch %psource %pushd %pwd %pycat %pylab %qtconsole %quickref %recall %rehashx %reload_ext %ren %rep %rerun %reset %reset_selective %rmdir %run %save %sc %set_env %store %sx %system %tb %time %timeit %unalias %unload_ext %who %who_ls %whos %xdel %xmode
Available cell magics:
%%! %%HTML %%SVG %%bash %%capture %%cmd %%debug %%file %%html %%javascript %%js %%latex %%markdown %%perl %%prun %%pypy %%python %%python2 %%python3 %%ruby %%script %%sh %%svg %%sx %%system %%time %%timeit %%writefile
Automagic is ON, % prefix IS NOT needed for line magics.
⑤查看%run的帮助文档
语法:%run?
运行结果:过长,自行敲
08.练习
①封装函数求闰年
代码1:
def is_leap(year):
return year % 4 ==0 and year % 100 != 0 or year % 400 ==0
代码2:is_leap(2000)
运行结果:True
②封装函数实现冒泡排序
代码1:
def my_sort(l):
for i in range(len(l) - 1):
for j in range(len(l) - i - 1):
if l[j] > l[j+1]:
l[j], l[j+1] = l[j+1] , l[j]#交换位置
return l
代码2:my_sort([1, 3, 6, 5, 2, 8, 7, 4])
运行结果:[1, 2, 3, 4, 5, 6, 7, 8]
第二章:NumPy
Python 的一个开源的数值计算库,可用来存储和处理大型矩阵,比python的嵌套列表结构高效很多
#%% md
01.开始学习NumPy
# 导包
import numpy as np
import matplotlib.pyplot as plt
# 查看版本
np.__version__
运行结果:'1.14.0'
# 图片是由数字组成的三维数组
# RGB:red,green,blue
# RGB:范围0~255
picture = plt.imread("2.1.jpg")
picture
运行结果:
array([[[ 0, 2, 7],
[ 0, 2, 7],
[ 0, 2, 7],
...,
[ 0, 3, 6],
[ 0, 3, 6],
[ 0, 3, 6]],
[[ 0, 2, 7],
[ 0, 2, 7],
[ 0, 2, 7],
...,
[ 0, 3, 6],
[ 0, 3, 6],
[ 0, 3, 6]],
[[ 0, 2, 7],
[ 0, 2, 7],
[ 0, 2, 7],
...,
[ 0, 3, 6],
[ 0, 3, 6],
[ 0, 3, 6]],
...,
[[ 0, 79, 146],
[ 0, 79, 146],
[ 0, 79, 146],
...,
[ 2, 49, 93],
[ 1, 48, 92],
[ 1, 48, 92]],
[[ 0, 79, 148],
[ 0, 79, 148],
[ 0, 79, 148],
...,
[ 1, 49, 95],
[ 1, 49, 95],
[ 1, 49, 95]],
[[ 0, 81, 151],
[ 0, 81, 151],
[ 0, 80, 151],
...,
[ 2, 50, 96],
[ 2, 50, 96],
[ 2, 50, 96]]], dtype=uint8)
type(picture)
# numpy.ndarray:多维数组
# nd:n维度
# 数组
运行结果:
numpy.ndarray
# 查看形状:三维
# (高,宽,RGB的值)
# 高:252行,宽度:500列,RGB的值:3
picture.shape
运行结果:(252, 500, 3)
# 显示图片
plt.imshow(picture)
图片:3维数据(彩色)
2维数据(黑白)
视频:4维数据(x,高,宽,RGB的值)
数据分析:一切皆数据,一切皆矩阵
02.创建ndarray数组
numpy默认numpy所有元素类型相同
如果传进来的列表包含不同的类型,则统一为同一类型,优先级:str>float>int
ndarray的常见数据类型:
int:int8,unit8(无符号,一个字节),int16,int32,int64
float:float16,float32,float64
str:字符串
①使用np.array()创建
eg.
l= [1,2,3]
n = np.array(l)
n
运行结果:array([1, 2, 3])
# 查看其类型
type(n)
运行结果:numpy.ndarray
# 查看其形状
# l.shape错的,l为列表,没有shape
n.shape
运行结果:(3,)
n=np.array([1,4,6,"hello",1.2])
n
运行结果:
array(['1', '4', '6', 'hello', '1.2'], dtype='<U11')
②使用np的routines函数创建
1)
np.ones(shape=,dtype=None,order='C')
创建一个所有元素都为1的多维数组
shape:形状
dtype=None,元素类型
order:“C”,"F"可选,"C"在内存中以行为主,"F"在内存中以列为主
一般默认即可
eg
n = np.ones(shape=(3,4))
n
运行结果:
array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
eg
n = np.ones(shape=(3,4,5),dtype = np.int16)
n
运行结果:
array([[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]]], dtype=int16)
2)np.zeros(shape=,dtype=float,order='C')
创建一个所有元素都为0的多维数组
shape=:形状
dtype = None:元素类型
eg.
n = np.zeros(shape=(3,4),dtype = np.int16)
n
运行结果:
array([[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]], dtype=int16)
3)np.full(shape=,fill_value,dtype=None,order='C')
创建一个所有元素都为指定元素的多维数组
shape:形状
fill_value:填充值
dtype = None:元素类型
eg.
n= np.full(shape=(3,5),fill_value = 7,dtype=np.int8)
n
运行结果:
array([[7, 7, 7, 7, 7],
[7, 7, 7, 7, 7],
[7, 7, 7, 7, 7]], dtype=int8)
4)np.eye(N,M=None,k=0,dtype=float)
对角线为1其他为0的二维数组
N:行数
M:列数,默认为None,和行一样
k=0:对角线每个都向右偏移0个位置,负数向左偏,正数向右偏
dtype=None:元素类型
eg.
n = np.eye(6,6,k=2,dtype=np.int8)
n
运行结果:
array([[0, 0, 1, 0, 0, 0],
[0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0]], dtype=int8)
5)np.linspace(start,num=50,endpoint=True,retstep=False.dtype=None)
创建一个等差数列
start:开始值
stop:结束值
num = 50:等差数列中默认有50个数
endpoint=True :是否有返回值
retstep=False:是否返回等差值(步长)
dtype=None:元素类型
eg.
n = np.linspace(0,100,num=51,dtype=np.int8)
n
运行结果:
array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24,
26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50,
52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76,
78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100],
dtype=int8)
eg.
n = np.linspace(0,100,num=51,retstep=True,dtype=np.int8)
n
运行结果:
(array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24,
26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50,
52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76,
78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100],
dtype=int8), 2.0)
6)* np.arange([start]stop,[step,]dtype=None)
创建一个数值范围的数组
和Python中的range功能类似
start:开始值(可选)
stop:结束值(不包含)
step:步长(可选)
dtype=None:元素类型
eg.
n = np.arange(1,20,3)
n
运行结果:array([ 1, 4, 7, 10, 13, 16, 19])
7)* np.random.randint(low,high=None,size=None,dtype='l')
创建一个随机整数的多维数组
low:最小值
high = None:最大值
如果high=None,生成的数值在[0,low)之间
如果使用high这个值,生成的数值在[low,high)之间
size=None:数组形状,默认只输出一个随机值
dtype=None:元素类型
eg.
n = np.random.randint(3)
n
运行结果:0
eg.
# 一维随机整数
n = np.random.randint(3,10,size=6)
n
运行结果:array([3, 5, 4, 6, 5, 7])
# 二维随机整数
n = np.random.randint(3,10,size=(2,4))
n
运行结果:
array([[5, 6, 9, 6],
[3, 7, 7, 5]])
# 三维随机整数,20个二维数组,一个数组40行3列
n = np.random.randint(0,256,size=(20,40,3))
n
运行结果:array([[[ 30, 122, 37],
[186, 184, 130],
[247, 44, 20],
…,
[209, 144, 86],
[188, 92, 110],
[ 28, 9, 94]],
[[176, 176, 12],
[189, 92, 160],
[186, 4, 85],
...,
[137, 202, 16],
[ 37, 207, 171],
[196, 194, 39]],
[[149, 98, 220],
[127, 174, 120],
[143, 120, 0],
...,
[141, 139, 117],
[ 32, 208, 72],
[ 67, 115, 109]],
...,
[[ 64, 167, 237],
[133, 62, 245],
[187, 181, 193],
...,
[229, 159, 2],
[252, 89, 9],
[208, 161, 205]],
[[112, 97, 196],
[123, 90, 134],
[ 11, 255, 136],
...,
[ 24, 189, 93],
[102, 203, 228],
[171, 216, 86]],
[[242, 217, 108],
[ 75, 75, 236],
[119, 141, 237],
...,
[ 79, 88, 38],
[122, 28, 29],
[145, 131, 105]]])
8)
np.random.randn(d0,d1,d2,...,dn)
创建一个服从标准正态分布的多维数组
标准正态分布:以0为均数,1为标准差的正态分布,在0左右出现的概率最大,越远离出现的概率越低
dn:第n个维度的数值
eg.
n = np.random.randn()
n
运行结果:1.908480407457795
eg.
n = np.random.randn(3,2)
n
运行结果:
array([[-0.9267283 , -1.30635666],
[-0.20752876, 1.62608297],
[ 0.47872274, -0.3451835 ]])
9)np.random.normal(loc=0.0,scale=1.0,size=None)
创建一个服从正态分布的多维数组
loc=0.0:均值对应着正态分布的中心
scale:标准差,对应着分布的宽度,scale越大,正态分布线越矮
size=None:形状
eg
n = np.random.normal(loc=100)
n
运行结果:99.84855773212374
n = np.random.normal(loc=100,size=(3,4))
n
运行结果:
array([[ 99.50714161, 100.62151901, 99.92331338, 98.46955622],
[ 99.55422095, 101.83281471, 99.61578694, 99.47357688],
[101.22157539, 99.48188286, 99.40355441, 98.68052448]])
10)* np.random.random(size=None)
创建一个元素0~1(左闭右开)的随机多维数组
size=None:数组形状
eg.
n =np.random.random(size=(3,4))
n
运行结果:
array([[0.55068558, 0.53786403, 0.49058346, 0.26086671],
[0.52167294, 0.33862798, 0.97514859, 0.58315967],
[0.26983238, 0.10702999, 0.84085722, 0.84733187]])
np.random.rand(d0,d1,...,dn)
创建一个元素0~1(左闭右开)的随机多维数组
size=None:数组形状
与np.random.random
功能一致
eg.
n =np.random.random((3,4))
n
运行结果:
array([[0.93459021, 0.00843056, 0.39550054, 0.24297299],
[0.66687175, 0.44803999, 0.5122349 , 0.27086015],
[0.98702141, 0.17513857, 0.94381547, 0.54350168]])
03.ndarray的属性
ndim:维度
shape:形状
size:总长度,总数据量
dtype:元素类型
# 第一个维度:252
# 第二个维度:500
# 第三维度:3
# 有几个数字代表几维
picture.shape
运行结果:(252, 500, 3)
picture.ndim
运行结果:3
picture.size
运行结果:378000
picture.dtype
运行结果:dtype('uint8')
04.NumPy的常用操作
①索引
一维与列表完全一致,多维同理
eg
l = [1,2,4,74,2]
l[0],l[-1]
运行结果:(1, 2)
n=np.array(l)
n[0],n[-1]
运行结果:(1, 2)
eg
# 二维
n = np.random.randint(0,10,size=(3,4))
n
运行结果:
array([[9, 7, 1, 6],
[8, 1, 6, 7],
[6, 3, 7, 6]])
eg
n[2][3],n[1][0]
运行结果:(6, 8)
# 修改数据
n[1][0]=3
n
运行结果:
array([[9, 7, 1, 6],
[3, 1, 6, 7],
[6, 3, 7, 6]])
eg
n[1]=[1,2,3,4]
n
运行结果:
array([[9, 7, 1, 6],
[1, 2, 3, 4],
[6, 3, 7, 6]])
②切片
一维与列表完全一致,多维同理
l=[1,25,4,2,5.8,5,8,2,0]
l[2:8] #切片
运行结果:[4, 2, 5.8, 5, 8, 2]
l[::-1] #翻转
运行结果:[0, 2, 8, 5, 5.8, 2, 4, 25, 1]
eg
n = np.array(l)
n[2:6],n[::-1]
运行结果:
(array([4. , 2. , 5.8, 5. ]),
array([ 0. , 2. , 8. , 5. , 5.8, 2. , 4. , 25. , 1. ]))
eg
# 二维或多维
n = np.random.randint(1,20,size=(5,7))
n
运行结果:
array([[ 5, 9, 1, 18, 18, 9, 15],
[ 7, 17, 13, 14, 5, 6, 18],
[18, 2, 2, 13, 3, 1, 19],
[12, 19, 12, 5, 3, 18, 14],
[19, 12, 9, 1, 5, 4, 5]])
# 取一行,索引
# print(n[0]),运行结果:[ 5 9 1 18 18 9 15]
# 取连续多行:切片
print(n[1:4])
运行结果:
[[ 7 17 13 14 5 6 18]
[18 2 2 13 3 1 19]
[12 19 12 5 3 18 14]]
# 取不连续的多行:中括号
print(n[[1,4,3]])
运行结果:[[ 7 17 13 14 5 6 18]
[19 12 9 1 5 4 5]
[12 19 12 5 3 18 14]]
# 取一列
print(n[:,0])#取所有行和定0列,:做切片操作,现在没有对行进行切片操作
# 取连续多列:切片
print(n[:,2:5])
# 取不连续的多列:[]
print(n[:,[1,3,4]])
运行结果:
[ 5 7 18 12 19]
[[ 1 18 18]
[13 14 5]
[ 2 13 3]
[12 5 3]
[ 9 1 5]]
[[ 9 18 18]
[17 14 5]
[ 2 13 3]
[19 5 3]
[12 1 5]]
05.图片的翻转
eg
n = np.random.randint(0,100,size=[5,6])
n
运行结果:
array([[26, 98, 90, 71, 44, 38],
[75, 24, 55, 6, 12, 71],
[75, 6, 80, 45, 80, 64],
[48, 37, 96, 33, 67, 76],
[75, 44, 43, 93, 20, 82]])
eg
# 行翻转
print(n[::-1])
# 列翻转
print(n[:,::-1])
运行结果:
[[75 44 43 93 20 82]
[48 37 96 33 67 76]
[75 6 80 45 80 64]
[75 24 55 6 12 71]
[26 98 90 71 44 38]]
[[38 44 71 90 98 26]
[71 12 6 55 24 75]
[64 80 45 80 6 75]
[76 67 33 96 37 48]
[82 20 93 43 44 75]]
eg
# 行翻转
plt.imshow(picture[::-1])
eg
# 列翻转
plt.imshow(picture[:,::-1])
eg
# 对颜色翻转:RGB-->BGR
plt.imshow(picture[:,:,::-1])
06.变形
eg
n = np.arange(1,21)
n
运行结果:
eg
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
18, 19, 20])
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
18, 19, 20])
eg
# reshape:将数组改变形状
n.shape
运行结果:(20,)
# 变成二维
n2 = np.reshape(n,(4,5))
n2
运行结果:
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10],
[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20]])
eg
n2.shape
运行结果:(4, 5)
# 使用-1:表示任意剩余维度长度
print(n2.reshape(4,-1))
print(n2.reshape(-1,2))
print(n2.reshape(-1))
运行结果:
[[ 1 2 3 4 5]
[ 6 7 8 9 10]
[11 12 13 14 15]
[16 17 18 19 20]]
[[ 1 2]
[ 3 4]
[ 5 6]
[ 7 8]
[ 9 10]
[11 12]
[13 14]
[15 16]
[17 18]
[19 20]]
[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20]
## NumPy数组的级联合并
n = np.random.randint(0,100,size=(3,5))
n1 = np.random.randint(1,200,size=(3,5))
display(n,n1)
运行结果:
array([[82, 88, 27, 11, 16],
[89, 50, 19, 90, 79],
[53, 91, 42, 87, 56]])
array([[ 35, 1, 16, 159, 152],
[ 53, 194, 39, 156, 140],
[101, 86, 105, 94, 45]])
07.级联合并
语法①:np.concatenate((n,n1),axis=)
np.concatenate((n,n1))#默认上下级联即是axis=0,axis=0表示第一个维度(行)
运行结果:
array([[ 82, 88, 27, 11, 16],
[ 89, 50, 19, 90, 79],
[ 53, 91, 42, 87, 56],
[ 35, 1, 16, 159, 152],
[ 53, 194, 39, 156, 140],
[101, 86, 105, 94, 45]])
eg
np.concatenate((n,n1),axis=1)#左右级联,axis=1表示第二个维度(列)
运行结果:
array([[ 82, 88, 27, 11, 16, 35, 1, 16, 159, 152],
[ 89, 50, 19, 90, 79, 53, 194, 39, 156, 140],
[ 53, 91, 42, 87, 56, 101, 86, 105, 94, 45]])
语法②:np.hstack((n,n1)):水平级联,左右合并
np.vstack((n,n1)):上下级联,垂直合并
np.hstack((n,n1))
运行结果:
array([[ 82, 88, 27, 11, 16, 35, 1, 16, 159, 152],
[ 89, 50, 19, 90, 79, 53, 194, 39, 156, 140],
[ 53, 91, 42, 87, 56, 101, 86, 105, 94, 45]])
eg
np.vstack((n,n1))
运行结果:
array([[ 82, 88, 27, 11, 16],
[ 89, 50, 19, 90, 79],
[ 53, 91, 42, 87, 56],
[ 35, 1, 16, 159, 152],
[ 53, 194, 39, 156, 140],
[101, 86, 105, 94, 45]])
08.切分/拆分/分割
与级联类似,三个函数完成切分工作
·np.split
·np.vsplit
·np.hsplit
eg
n = np.random.randint(0,200,size=(8,6))
n
运行结果:
array([[ 20, 191, 162, 136, 51, 168],
[171, 129, 119, 139, 56, 158],
[ 92, 113, 58, 35, 127, 77],
[150, 171, 77, 148, 137, 15],
[187, 68, 145, 111, 147, 167],
[191, 17, 164, 129, 40, 41],
[125, 3, 55, 170, 162, 148],
[ 49, 94, 15, 90, 116, 137]])
语法:np.vsplit(数组,分割数),np.hsplit(数组,分割数)
eg
# 垂直拆分,平均拆成4分
np.vsplit(n,4)
运行结果:
[array([[185, 38, 7, 142, 141, 176],
[ 24, 87, 107, 20, 190, 183]]),
array([[187, 38, 3, 76, 118, 60],
[ 54, 0, 124, 63, 134, 54]]),
array([[ 54, 19, 133, 53, 132, 65],
[ 91, 183, 181, 66, 154, 118]]),
array([[ 12, 110, 83, 155, 129, 135],
[ 67, 81, 196, 52, 75, 32]])]
eg
# 按照指定位置拆分
np.vsplit(n,(1,2,5))
运行结果:
[array([[ 20, 191, 162, 136, 51, 168]]),
array([[171, 129, 119, 139, 56, 158]]),
array([[ 92, 113, 58, 35, 127, 77],
[150, 171, 77, 148, 137, 15],
[187, 68, 145, 111, 147, 167]]),
array([[191, 17, 164, 129, 40, 41],
[125, 3, 55, 170, 162, 148],
[ 49, 94, 15, 90, 116, 137]])]
# 水平拆分
np.hsplit(n,3)
运行结果:
[array([[ 20, 191],
[171, 129],
[ 92, 113],
[150, 171],
[187, 68],
[191, 17],
[125, 3],
[ 49, 94]]), array([[162, 136],
[119, 139],
[ 58, 35],
[ 77, 148],
[145, 111],
[164, 129],
[ 55, 170],
[ 15, 90]]), array([[ 51, 168],
[ 56, 158],
[127, 77],
[137, 15],
[147, 167],
[ 40, 41],
[162, 148],
[116, 137]])]
# 按照指定位置拆分
np.hsplit(n,(0,2,5))
运行结果:
[array([], shape=(8, 0), dtype=int32), array([[ 20, 191],
[171, 129],
[ 92, 113],
[150, 171],
[187, 68],
[191, 17],
[125, 3],
[ 49, 94]]), array([[162, 136, 51],
[119, 139, 56],
[ 58, 35, 127],
[ 77, 148, 137],
[145, 111, 147],
[164, 129, 40],
[ 55, 170, 162],
[ 15, 90, 116]]), array([[168],
[158],
[ 77],
[ 15],
[167],
[ 41],
[148],
[137]])]
split:可以做水平或垂直拆分
axis = 0行
axis = 1列
默认按行拆分
语法np.split(矩阵,分割数,axis=)
np.split(n,2) #等效于np.split(n,2,axis=0)
运行结果:
[array([[ 20, 191, 162, 136, 51, 168],
[171, 129, 119, 139, 56, 158],
[ 92, 113, 58, 35, 127, 77],
[150, 171, 77, 148, 137, 15]]),
array([[187, 68, 145, 111, 147, 167],
[191, 17, 164, 129, 40, 41],
[125, 3, 55, 170, 162, 148],
[ 49, 94, 15, 90, 116, 137]])]
eg
np.split(n,2,axis=1)
运行结果:
[array([[ 20, 191, 162],
[171, 129, 119],
[ 92, 113, 58],
[150, 171, 77],
[187, 68, 145],
[191, 17, 164],
[125, 3, 55],
[ 49, 94, 15]]), array([[136, 51, 168],
[139, 56, 158],
[ 35, 127, 77],
[148, 137, 15],
[111, 147, 167],
[129, 40, 41],
[170, 162, 148],
[ 90, 116, 137]])]
拆分图片
eg
picture.shape
运行结果:
(252, 500, 3)
plt.imshow(picture)
picture1 = np.split(picture,2)
picture1[0]#上半部分
picture1[1]#下半部分
plt.imshow(picture1[0])
plt.imshow(picture1[1])
plt.imshow(picture2[1])#右半部分
picture2 = np.split(picture,2,axis=1)
plt.imshow(picture2[1])#右半部分
plt.imshow(picture2[0])#左半部分
/拷贝
09.复制/副本/拷贝
copy()
函数创建副本
eg
# 赋值:用同一个内存
n = np.arange(10)
n2 = n
n2[2] = 100
display(n,n2)
运行结果:
array([ 0, 1, 100, 3, 4, 5, 6, 7, 8, 9])
array([ 0, 1, 100, 3, 4, 5, 6, 7, 8, 9])
eg
# 拷贝
n = np.arange(10)
n2 = n.copy()
n2[1]=300
display(n,n2)
运行结果
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
array([ 0, 300, 2, 3, 4, 5, 6, 7, 8, 9])
eg
n = np.random.randint(0,10,size=(3,4))
n2=n.copy()
n2[0,0]=3
display(n,n2)
运行结果:
array([[7, 3, 4, 0],
[2, 3, 9, 9],
[6, 6, 9, 0]])
array([[3, 3, 4, 0],
[2, 3, 9, 9],
[6, 6, 9, 0]])
10.Numpy的聚合操作
①求和np.sum
语法:np.sum(矩阵)
eg
n = np.arange(0,10)
display(n,np.sum(n))
运行结果
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
45
所有数求和
eg
n = np.random.randint(0,10,size=(3,4))
display(n,np.sum(n)) #np.sum(n)所有数求和
运行结果:
array([[1, 7, 8, 5],
[3, 4, 6, 6],
[0, 5, 3, 1]])
49
eg
# axis=0,每一列的多行求和
np.sum(n,axis=0)
运行结果:
array([ 4, 16, 17, 12])
eg
# axis=0,每一行的多列求和
np.sum(n,axis=1)
运行结果:
array([21, 19, 9])
②其他常见聚合函数
np.min
最小值
np.max
最大值
np.mean
平均值
np.average
平均值
np.median
中位数
np.percentile
百分位数
np.argmin
最小值对应的下标
np.argmax
最大值对应的下标
np.std
标准差
np.var
方差
np.power
次方,求幂
np.argwhere
按条件查找
np.nan
:float类型
③np.sum 和 np.nansum(nan: not a number)
nan:数值类型,不是一个正常的数值,表示空
np.nan:float类型
eg
n = np.array([1,2,np.nan])
n
运行结果:
array([ 1., 2., nan])
np.sum(n)#无法求出和
nan
eg
数的和
np.nansum(n)#排除nan后剩下数的和
运行结果:
3.0
11.NumPy的矩阵操作
①基本矩阵操作
·加减乘除
n = np.random.randint(10,100,size=(5,6))
n
运行结果:
array([[80, 65, 32, 22, 54, 83],
[83, 94, 39, 55, 15, 13],
[34, 62, 77, 58, 22, 77],
[55, 15, 80, 66, 96, 86],
[56, 48, 40, 81, 79, 94]])
eg
display(n + 100,n-100,n*2,n/2,n//2,n**2,n%2)
运行结果:
array([[180, 165, 132, 122, 154, 183],
[183, 194, 139, 155, 115, 113],
[134, 162, 177, 158, 122, 177],
[155, 115, 180, 166, 196, 186],
[156, 148, 140, 181, 179, 194]])
array([[-20, -35, -68, -78, -46, -17],
[-17, -6, -61, -45, -85, -87],
[-66, -38, -23, -42, -78, -23],
[-45, -85, -20, -34, -4, -14],
[-44, -52, -60, -19, -21, -6]])
array([[160, 130, 64, 44, 108, 166],
[166, 188, 78, 110, 30, 26],
[ 68, 124, 154, 116, 44, 154],
[110, 30, 160, 132, 192, 172],
[112, 96, 80, 162, 158, 188]])
array([[40. , 32.5, 16. , 11. , 27. , 41.5],
[41.5, 47. , 19.5, 27.5, 7.5, 6.5],
[17. , 31. , 38.5, 29. , 11. , 38.5],
[27.5, 7.5, 40. , 33. , 48. , 43. ],
[28. , 24. , 20. , 40.5, 39.5, 47. ]])
array([[40, 32, 16, 11, 27, 41],
[41, 47, 19, 27, 7, 6],
[17, 31, 38, 29, 11, 38],
[27, 7, 40, 33, 48, 43],
[28, 24, 20, 40, 39, 47]], dtype=int32)
array([[6400, 4225, 1024, 484, 2916, 6889],
[6889, 8836, 1521, 3025, 225, 169],
[1156, 3844, 5929, 3364, 484, 5929],
[3025, 225, 6400, 4356, 9216, 7396],
[3136, 2304, 1600, 6561, 6241, 8836]], dtype=int32)
array([[0, 1, 0, 0, 0, 1],
[1, 0, 1, 1, 1, 1],
[0, 0, 1, 0, 0, 1],
[1, 1, 0, 0, 0, 0],
[0, 0, 0, 1, 1, 0]], dtype=int32)
eg
n2 = np.random.randint(10,100,size=(5,6))
n2
n2 = np.random.randint(10,100,size=(5,6))
n2
display(n+n2,n-n2)
运行结果:
array([[118, 143, 65, 60, 96, 180],
[126, 148, 105, 84, 113, 68],
[111, 91, 143, 107, 85, 119],
[131, 81, 170, 137, 162, 137],
[ 71, 77, 71, 177, 135, 182]])
array([[ 42, -13, -1, -16, 12, -14],
[ 40, 40, -27, 26, -83, -42],
[-43, 33, 11, 9, -41, 35],
[-21, -51, -10, -5, 30, 35],
[ 41, 19, 9, -15, 23, 6]])
②矩阵积np.dot()
第一个矩阵的列数=第二个矩阵的行数
n3 = np.random.randint(10,100,size=(6,6))
n3
运行结果:
array([[84, 30, 19, 15, 79, 43],
[29, 64, 85, 83, 98, 54],
[99, 38, 35, 84, 66, 74],
[87, 56, 10, 87, 99, 65],
[45, 86, 96, 41, 45, 66],
[72, 54, 30, 60, 13, 14]])
eg
np.dot(n,n3)
运行结果:
array([[22093, 18134, 16059, 18391, 20489, 15474],
[19955, 15060, 13312, 18503, 24632, 16278],
[23857, 17212, 13613, 22692, 21577, 16808],
[29229, 22246, 17576, 23628, 23067, 20925],
[27426, 22678, 17758, 24110, 24564, 19755]])
矩阵操作
③线性代数中其他常用的矩阵操作
n = np.array([[1,2,3],[23,4,6],[1,3,5]])
# 矩阵的逆
np.linalg.inv(n)
运行结果:
array([[-9.52380952e-02, 4.76190476e-02, 7.72329061e-17],
[ 5.19047619e+00, -9.52380952e-02, -3.00000000e+00],
[-3.09523810e+00, 4.76190476e-02, 2.00000000e+00]])
)
# 矩阵的行列式,round()
np.round(np.linalg.det(n))
运行结果:
-21.0
# 矩阵的秩
np.linalg.matrix_rank(n)
运行结果:
3
12.广播机制
** ndarray广播机制的两条规则
规则一:为缺失的维度补维度
规则二:缺失元素用已有值填充
eg
n = np.ones((2,3),dtype=np.int8)
n1 = np.arange(1,4)
display(n,n1)
运行结果:
array([[1, 1, 1],
[1, 1, 1]], dtype=int8)
array([1, 2, 3])
eg
n+n1
运行结果:
array([[2, 3, 4],
[2, 3, 4]])
eg
a = np.arange(3).reshape((3, 1))
b = np.arange(3)
display(a,b)
array([[0],
[1],
[2]])
array([0, 1, 2])
eg
a + b
array([[0, 1, 2],
[1, 2, 3],
[2, 3, 4]])
其他常见数学操作
abs(绝对值)、sqrt(平方根)、square(平方)、exp(指数)、log(对数)、sin(正弦函数)、cos(余弦函数)、tan(正切)、round(四舍五入)、ceil(向上取整)、floor(向下取整)、cumsum(累加)
13.ndarray的排序
数组
快速排序
np.sort(数组)
与ndarray.sort()
都可以,但有区别:
np.sort(数组)不改变原数组
ndarray.sort()本地处理,不占用空间,但改变原数组
n = np.random.randint(0,100,size=(3,4))
n
运行结果:
array([[33, 11, 55, 14],
[57, 12, 75, 65],
[63, 2, 33, 66]])
eg
np.sort(n)
运行结果:
array([[11, 14, 33, 55],
[12, 57, 65, 75],
[ 2, 33, 63, 66]])
eg
n
array([[33, 11, 55, 14],
[57, 12, 75, 65],
[63, 2, 33, 66]])
eg
n.sort()
n
运行结果:
array([[11, 14, 33, 55],
[12, 57, 65, 75],
[ 2, 33, 63, 66]])
14.ndarray文件操作
①保存数组
save : 保存ndarray到一个npy文件
savez : 将多个array保存到一个npz文件中
,xarr=x,yarr=y
x = np.arange(5)
y = np.arange(10,20)
# save:保存x.npy
np.save('x',x)
# savaz:
np.savez('arrs.npz',xarr=x,yarr=y)
# 读取npy文件
np.load('x.npy')
运行结果:
array([0, 1, 2, 3, 4])
# 读取npz文件
np.load('arrs.npz')
运行结果<numpy.lib.npyio.NpzFile at 0x21542317b38>
’
# 读取npz文件
np.load('arrs.npz')['xarr']
运行结果
array([0, 1, 2, 3, 4])
②csv、txt文件的读写操作
n = np.random.randint(0, 10, size=(5, 4))
n
运行结果
array([[7, 1, 9, 8],
[1, 1, 4, 1],
[6, 8, 8, 8],
[8, 7, 1, 7],
[2, 6, 5, 2]])
limiter=’ ’ :分割符
存到csv,txt
delimiter=’ ’ :分割符
eg
np.savetxt('arr.csv',n,delimiter=' ')
np.loadtxt('arr.csv',delimiter=" ",dtype=np.int16)
运行结果
array([[7, 1, 9, 8],
[1, 1, 4, 1],
[6, 8, 8, 8],
[8, 7, 1, 7],
[2, 6, 5, 2]], dtype=int16)