在命令窗口中执行以下命令:
jupyter notebook
In [1]:
# 打印100 print(100) 100 In [ ]:
• Shift + Enter : 运行本单元,选中下个单元
• Ctrl + Enter : 运行本单元
• Alt + Enter : 运行本单元,在其下插入新单元
• Y : 单元转入代码状态
• M : 单元转入markdown状态
• A : 在上方插入新单元
• B : 在下方插入新单元
• DD : 删除选中的单元
In [ ]:a = 100
In [ ]# Python
In [4]:a = 100
In [5]:a
Out[5]:100
• Shift + Enter : 运行本单元,选中下一单元
• Ctrl + Enter : 运行本单元
• Alt + Enter : 运行本单元,在下面插入一单元
In [ ]:
• Ctrl + A : 全选
• Ctrl + Z : 撤销
• Ctrl + C : 复制
• Ctrl + V : 粘贴
• Ctrl + / : 注释或取消注释
通过以下命令来获得帮助文档:
help(len)
In [8]:
help(len) Help on built-in function len in module builtins: len(obj, /) Return the number of items in a container.
或者使用问号:
len?
In [9]:len?
还可以应用到自定义的变量和自定义的函数上来返回帮助文档
此外,使用两个??可以把函数的源代码显示出来
In [7]:def add(a, b):
"""add function""" return a + b In [11]:add?In [12]:add??
使用下面命令运行外部python文件(默认是当前目录,也可以使用绝对路径)
%run *.py
示例: 在当前目录下有一个myscript.py文件:
def square(x):
"""square a number"""
return x ** 2
for N in range(1, 4):
print(N, "squared is", square(N))
我们可以通过下面命令执行它:
%run myscript.py
In [15]:
%run myscript.py1 squared is 1 2 squared is 4 3 squared is 9
尤其要注意的是,当我们使用魔法命令执行了一个外部文件时,该文件的函数就能在当前会话中使用
square(5)
In [17]:
square(5) square(6)
Out[17]:36
In [18]:a = square(5)
b = square(6)
a, b
Out[18]:(25, 36)
In [19]:a = square(5)
b = square(6)
display(a, b)
25 36
In [20]:
a = square(5)
b = square(6)
print(a, b)
25 36
In [21]:
import myscript
. . .
用下面命令计算statement的运行时间:
%time statement
In [25]:
# %time :一般用来统计耗时较长代码的运行时长
%time square(1000)
Wall time: 0 ns
Out[25]:
1000000
用下面命令计算statement的平均运行时间:
%timeit statement
timeit会多次运行statement,最后得到一个更为精准的预期运行时间
In [27]
# %timeit会多次运行statement,最后得到一个更为精准的预期运行时间%timeit square(1000)390 ns ± 8.22 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)In [28]:
%timeit -r 3 -n 1000 square(1000)360 ns ± 3.99 ns per loop (mean ± std. dev. of 3 runs, 1000 loops each)
可以使用两个百分号来测试多行代码的平均运行时间:
` %%timeit
statement1
statement2
statement3
`
In [30]:
%%timeit quare(1000) add(10, 20) 524 ns ± 12.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)In [31]:
%%time square(1000) add(10, 20) Wall time: 0 nsOut[31]:30
记住:
In [ ]:
快速查看当前会话的所有变量与函数名称:
%who
In [32]:%who
N a add b myscript numpy square
查看当前会话的所有变量与函数名称的详细信息:
%whos
In [33]:
%whosVariable Type Data/Info -------------------------------- N int 3 a int 25 add functionb int 36 myscript module .Jupyter教程\\myscript.py'> numpy module ges\\numpy\\__init__.py'> square function
返回一个字符串列表,里面元素是当前会话的所有变量与函数名称:
%who_ls
In [34]:
%who_lsOut[34]:
['N', 'a', 'add', 'b', 'myscript', 'numpy', 'square']
In [35]:
pip install numpyRequirement already satisfied: numpy in c:\users\ijeff\appdata\roaming\python\python38\site-packages (1.21.5) Note: you may need to restart the kernel to use updated packages.
列出所有魔法命令
lsmagic
查看魔法命令的文档: 使用?
In [36]:
lsmagicIn [37]:
%run?
============================================
对应刚使用Jupyter Notebook的同学,需要多加练习,达到数量使用Jupyter写代码
============================================
练习1: 封装函数求闰年
In [38]:
def is_leap(y):return y%4==0 and y%100!=0 or y%400==0In [40]:
is_leap(2032)Out[40]:
True
练习2:封装函数实现冒泡排序
In [45]:
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 lIn [46]:
my_sort([1, 3, 6, 5, 2, 8, 7, 4])Out[46]:
[1, 2, 3, 4, 5, 6, 7, 8
jupyter:01_JupyterNotebook使用教程 - Jupyter Notebook
In [1]:
# 数据分析三剑客
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
In [2]:
# 版本
np.__version__
Out[2]:
'1.23.5'
In [3]:
# cat.jpg
# 图片: 其实是数字组成的,三维数组
# RGB 红Red, 绿Green,蓝Blue
# RGB 范围:0~255
# plt.imread: 读取图片的数据
cat = plt.imread('cat.jpg')
cat
--------------------------------------------------------------------------- FileNotFoundError Traceback (most recent call last) ~\AppData\Local\Temp\ipykernel_30712\1529493578.py in5 6 # plt.imread: 读取图片的数据 ----> 7 cat = plt.imread('cat.jpg') 8 cat G:\Anaconda3\lib\site-packages\matplotlib\pyplot.py in imread(fname, format) 2193 @_copy_docstring_and_deprecators(matplotlib.image.imread) 2194 def imread(fname, format=None): -> 2195 return matplotlib.image.imread(fname, format) 2196 2197 G:\Anaconda3\lib\site-packages\matplotlib\image.py in imread(fname, format) 1561 "``np.array(PIL.Image.open(urllib.request.urlopen(url)))``." 1562 ) -> 1563 with img_open(fname) as image: 1564 return (_pil_png_to_float_array(image) 1565 if isinstance(image, PIL.PngImagePlugin.PngImageFile) else G:\Anaconda3\lib\site-packages\PIL\Image.py in open(fp, mode, formats) 3090 3091 if filename: -> 3092 fp = builtins.open(filename, "rb") 3093 exclusive_fp = True 3094 FileNotFoundError: [Errno 2] No such file or directory: 'cat.jpg'
In [ ]:
type(cat)
# numpy.ndarray : 多维数组
# nd : n维度,多维
# array: 数组
In [ ]:
# 查看形状:三维
# (421, 725, 3) :
# 高度:421行
# 宽度:725列
# 3表式的是RGB(red, green, blue)的值
cat.shape
In [ ]:
# 显示图片
plt.imshow(cat)
# (421, 725, 3)
In [ ]:
# 图片:3维数据(彩色)
# 2维数据 (黑白)
# 视频:4维数据
# (x, 421, 725, 3)
# 一切皆数据,一切皆矩阵
注意:
In [ ]:
l = [1, 4, 2, 3, 5, 6]
n = np.array(l)
n
In [ ]:
type(n) # 类型
# numpy.ndarray
In [ ]:
n.shape # 形状
# l.shape # 列表没有shape
In [ ]:
# 优先级:str>float>int
n = np.array([3.14, 2, "hello"])
n
1) np.ones(shape, dtype=None, order='C')
参数说明:
In [ ]:
n = np.ones(shape=(3, 4))
n
In [ ]:
n = np.ones(shape=(3, 4, 5), dtype=np.int16)
# n = np.ones(shape=(3, 4), dtype=int)
n
2) np.zeros(shape, dtype=float, order='C')
参数说明:
In [ ]:
n = np.zeros((5, 5), dtype=np.int16)
n
3) np.full(shape, fill_value, dtype=None, order='C')
参数说明:
In [ ]:
n = np.full(shape=(3, 4), fill_value=2)
n
4) np.eye(N, M=None, k=0, dtype=float)
参数说明:
In [ ]:
# 对角线为1其他的位置为0的二维数组
# 单位矩阵: 主对角线都是1,其他都是0
n = np.eye(6, 6, dtype=np.int8)
n
In [ ]:
# k=2 : 向右偏移2个位置
n = np.eye(6, 6, k=2, dtype=np.int8)
# k=-2 : 向左偏移2个位置
n = np.eye(6, 6, k=-2, dtype=np.int8)
n
5) np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
参数说明:
In [ ]:
# 等差数列
# 1, 3, 5, 7, 9
n = np.linspace(0, 100, num=51, dtype=np.int16)
n
In [ ]:
# endpoint=False
n = np.linspace(0, 100, num=51, endpoint=False)
n
In [ ]:
# retstep=True : 显示步长
n = np.linspace(0, 100, num=51, retstep=True)
n
6) np.arange([start, ]stop, [step, ]dtype=None)
参数说明:
In [ ]:
n = np.arange(10)
n
In [ ]:
n = np.arange(2, 10)
n
In [ ]:
n = np.arange(2, 10, 2)
n
7) np.random.randint(low, high=None, size=None, dtype='l')
参数说明:
In [ ]:
# 随机整数, 范围:[0, 3)
n = np.random.randint(3)
n
In [ ]:
# 随机整数, 范围:[3, 10)
n = np.random.randint(3, 10)
n
In [ ]:
# 随机整数:一维
n = np.random.randint(3, 10, size=6)
n
In [ ]:
# 随机整数:二维
n = np.random.randint(3, 10, size=(3, 4))
n
In [ ]:
# 随机整数:三维
# 0~255
n = np.random.randint(0, 256, size=(20, 40, 3))
n
In [ ]:
plt.imshow(n)
In [ ]:
cat
In [ ]:
plt.imshow(cat)
8) np.random.randn(d0, d1, ..., dn)
标准正态分布又称为u分布,是以0为均数、以1为标准差的正态分布,记为N(0,1) 标准正态分布, 在0左右出现的概率最大, 越远离出现的概率越低, 如下图
参数说明:
In [ ]:
n = np.random.randn()
n
In [ ]:
n = np.random.randn(10)
n
In [ ]:
n = np.random.randn(3, 4)
n
9)np.random.normal(loc=0.0, scale=1.0, size=None)
参数说明:
In [ ]:
n = np.random.normal(loc=100, scale=10, size=(3, 4))
n
10) np.random.random(size=None)
参数说明:
In [ ]:
n = np.random.random(size=(3, 4))
n
11) np.random.rand(d0, d1, ..., dn)
参数说明:
In [ ]:
n = np.random.rand(3, 4)
n
4个重要属性:
In [ ]:
cat
In [ ]:
cat.shape # 三维数组
# (421, 725, 3)
# 第一个维度: 421
# 第二个维度: 725
# 第三个维度:3
# 有几个数字就表示 几维
In [ ]:
cat.ndim # 维度
In [ ]:
cat.size # 总数据量
In [ ]:
421 * 725 * 3
In [ ]:
cat.dtype # 于是乃类型
# uint8 : 无符号整数,8位表式1个字节 0000 0000
一维与列表完全一致 多维时同理
In [ ]:
l = [1, 2, 3, 4, 5, 6]
l[0], l[-1]
In [ ]:
n = np.array(l)
n[0], n[-1]
In [ ]:
# 二维
n = np.random.randint(0, 10, size=(4, 5))
n
In [ ]:
# 找到最后一个数
n[3][4]
n[-1][-1]
# 简写
n[3, 4]
n[-1, -1]
In [ ]:
# 三维
n = np.random.randint(0, 100, size=(4, 5, 6))
n
In [ ]:
# 找到86
n[1][2][-1]
n[1, 2, -1]
根据索引修改数据
In [ ]:
n[1, 2, -1] = 886
In [ ]:
n
In [ ]:
n[1][2] = 100
In [ ]:
n
In [ ]:
n[1, 2] = [1, 2, 3, 4, 5, 6]
n
一维与列表完全一致 多维时同理
In [ ]:
# Python列表中的切片
l = [1, 2, 3, 4, 5, 6, 7, 88, 9]
l[2 : 6]
l[: : -1] # 翻转
In [ ]:
# NumPy 数组
n = np.array(l)
n
In [ ]:
n[2 : 6], l[: : -1]
In [ ]:
# 二维 或多维
n = np.random.randint(0, 10, size=(6, 8))
n
In [ ]:
# 行
# 取一行: 索引
print(n[0])
# 取连续多行: 切片
print(n[ 1 : 4 ])
# 取不连续的多行: 中括号
print(n[ [1, 4, 2, 2, 2] ])
In [ ]:
# 列
n
In [ ]:
# 列
# 取一列
print( n[ 1:4 , 0] ) # 取所有行,和第0列
# 取连续的多列: 切片
print( n[ : , 2 : 5] )
# 取不连续的多列: 中括号
print( n[ : , [1, 3, 4]] )
In [ ]:
n = np.random.randint(0, 100, size=(5, 6))
n
In [ ]:
# 行翻转
n[ : : -1]
In [ ]:
# 列翻转: 相当于是对第二个维度做翻转
n[:, ::-1]
In [ ]:
cat
In [ ]:
cat.shape # 3维
In [ ]:
# 原图
plt.imshow(cat)
In [ ]:
# 行翻转:上下翻转
plt.imshow( cat[::-1] )
In [ ]:
# 列翻转:左右翻转
plt.imshow( cat[:, ::-1] )
In [ ]:
# 对颜色翻转: RGB => BGR
plt.imshow( cat[:, :, ::-1])
In [ ]:
plt.imshow( cat[::10, ::10, ::-1])
使用reshape函数
In [ ]:
n = np.arange(1, 21)
n
In [ ]:
# reshape: 将数组改变形状
n.shape
In [ ]:
# 变成二维
n2 = np.reshape(n, (4, 5))
n2
In [ ]:
n2.shape
In [ ]:
n2.reshape((5, 4))
n2.reshape(5, 4)
# 变成1维
# 使用-1 : 表式任意剩余维度长度
n2.reshape(20)
n2.reshape(-1)
n2.reshape(4, -1)
n2.reshape(5, -1)
n2.reshape(-1, 2)
n2.reshape(-1, 1)
n2.reshape(2, -1, 2)
np.concatenate()
In [ ]:
n1 = np.random.randint(0, 100, size=(3, 5))
n2 = np.random.randint(0, 100, size=(3, 5))
display(n1, n2)
In [ ]:
# 级联,合并
np.concatenate((n1, n2)) # 默认上下合并
np.concatenate((n1, n2), axis=0) # 上下合并 axis=0表式第一个维度(行)
In [ ]:
# 左右合并 axis=1 表式第2个维度(列)
np.concatenate((n1, n2), axis=1)
np.hstack与np.vstack
In [ ]:
# np.hstack : 水平级联,左右合并
np.hstack((n1, n2))
In [ ]:
# np.vstack: 上下合并,垂直级联
np.vstack((n1, n2))
与级联类似,三个函数完成切分工作:
In [ ]:
n = np.random.randint(0, 100, size=(6, 4))
n
In [ ]:
# 垂直拆分,平均拆成3份
np.vsplit(n, 3)
In [ ]:
# 可以按照指定位置拆分
np.vsplit(n, (1, 2, 4))
In [ ]:
# 水平方向拆分
np.hsplit(n, 2)
In [ ]:
n
In [ ]:
# split: 可以做水平或垂直拆分
# axis=0 行
# axis=1 列
np.split(n, 2) # 默认按行拆分
np.split(n, 2, axis=0) # 按行拆分
np.split(n, 2, axis=1) # 按列拆分
In [ ]:
cat.shape
In [ ]:
cat2 = cat[ : -1]
cat2.shape
In [ ]:
plt.imshow(cat2)
In [ ]:
cat3 = np.split(cat2, 2)
cat3[0] # 上半部分
cat3[1] # 下半部分
plt.imshow(cat3[0])
In [ ]:
plt.imshow(cat3[1])
In [ ]:
# 水平拆分
cat4 = np.split(cat2, 5, axis=1)
cat4
plt.imshow(cat4[2])
copy()函数创建副本
In [ ]:
# 赋值 : 用的是同一个内存
n = np.arange(10)
n2 = n
n2[0] = 100
display(n, n2)
In [ ]:
# 拷贝: copy
n1 = np.arange(10)
# n1
n2 = n1.copy()
n2[0] = 100
display(n1, n2)
In [ ]:
# 深拷贝copy
n = np.random.randint(0, 10, size=(2, 3))
n2 = n.copy()
n2[0, 0] = 100
display(n, n2)
In [ ]:
n = np.arange(10)
n
In [ ]:
np.sum(n)
In [ ]:
n = np.random.randint(0, 10, size=(3, 5))
n
In [ ]:
np.sum(n) # 所有数的和
In [ ]:
# axis=0 : 表式每一列的多行求和
np.sum(n, axis=0)
In [ ]:
# axis=1 : 表式每一行中的多列求和
np.sum(n, axis=1)
In [ ]:
n = np.random.randint(0, 10, size=(3, 5))
n
In [ ]:
np.max(n) # 最大值
np.min(n) # 最小值
np.mean(n) # 平均值
np.average(n) # 平均值
np.median(n) # 中位数
np.percentile(n, q=0.5) # 百分位数, q=50表式中位数
n = n.reshape(-1)
display(n)
np.argmax(n) # 第一个最大值对应的下标
np.argmin(n) # 第一个最小值对应的下标
np.argwhere(n==np.max(n)) # 按条件找到所有最大值的下标
np.power(n, 3) # 次方
# n ** 3
np.std(n) # 标准差
np.var(n) # 方差
In [ ]:
n = np.array([1, 2, 3, np.nan])
n
In [ ]:
np.sum(n) # 无法求出和
In [ ]:
np.nansum(n) # 排除掉nan之后,剩下的数的和
1) 算术运算符:
In [4]:
n = np.random.randint(0, 10, size=(4, 5))
n
Out[4]:
array([[9, 1, 4, 1, 7], [7, 1, 9, 8, 2], [4, 4, 7, 5, 3], [9, 5, 1, 0, 3]])
In [5]:
# n + 10 # 加
# n - 10 # 减
n * 10 # 乘
# n / 10 # 除
# n // 2 # 整除
# n ** 2 # 次方
# n % 2 # 余数
Out[5]:
array([[90, 10, 40, 10, 70], [70, 10, 90, 80, 20], [40, 40, 70, 50, 30], [90, 50, 10, 0, 30]])
In [ ]:
n1 = np.random.randint(0, 10, size=(4, 5))
n2 = np.random.randint(0, 10, size=(4, 5))
display(n1, n2)
In [ ]:
n1 + n2
n1 * n2
2) 线性代数
In [ ]:
n1 = np.random.randint(0, 5, size=(2, 3))
n2 = np.random.randint(0, 5, size=(3, 2))
display(n1, n2)
In [ ]:
np.dot(n1, n2)
# [4, 3, 4],
# [1, 2, 4]
#
# [4, 3],
# [4, 4],
# [0, 4]
#
# = [4*4 + 3*4, 4*3+3*4+4*4]
# [1*4 + 2*4, 1*3+2*4+4*4]
# =[28, 40]
# [12, 27]
In [ ]:
# 线性代数常用
n = np.array([[1, 2, 3],
[2, 5, 4],
[4, 5, 8]])
# 矩阵逆
np.linalg.inv(n)
# 矩阵的行列式
np.round(np.linalg.det(n))
# 行列式计算: 矩阵的所有主对角线-所有副对角线
# 1*5*8 + 2*4*4 + 3*2*5 - (3*5*4 +2*2*8 + 1*4*5 ) = -10
# 矩阵的秩 (满秩矩阵,奇异矩阵)
# 方阵
np.linalg.matrix_rank(n)
【重要】ndarray广播机制的两条规则
例1:
m = np.ones((2, 3))
a = np.arange(3)
求m+a
In [ ]:
m = np.ones((2, 3), dtype=np.int8)
a = np.arange(3)
display(m, a)
In [ ]:
m + a
例2:
a = np.arange(3).reshape((3, 1))
b = np.arange(3)
求a+b
In [ ]:
a = np.arange(3).reshape((3, 1))
b = np.arange(3)
display(a, b)
In [ ]:
a + b
习题:
a = np.ones((4, 1))
b = np.arange(4)
求a+b
In [ ]:
a = np.ones((4, 1), dtype=np.int8)
b = np.arange(4)
display(a, b)
In [ ]:
a + b
In [ ]:
n = np.array([1, 4, 8, 9, 16, 25, 64])
np.abs(n) # 绝对值
np.sqrt(n) # 平方根
# n ** 0.5
np.square(n) # 平方
# n ** 2
np.exp(n) # 指数 e=2.718281828459045
np.log(n) # 自然对数:以e为底的对数, ln3
np.log(np.e) # 1
np.log(1) # 0
np.log2(n) # 2为底的对数
np.log10(n) # 10为底的对数,常用对数
np.sin(n) # 正弦
np.cos(n) # 余弦
np.tan(n) # 正切
np.round(n, 2) # 四舍五入
np.ceil(n) # 向上取整
np.floor(n) # 向下取整
np.cumsum(n) # 累加
# [1, 4, 8, 9, 16, 25, 64]
# [1, 5,13, 22, 38, 63, 127]
np.sort()与ndarray.sort()都可以,但有区别:
In [ ]:
n1 = np.random.randint(0, 10, size=6)
n1
In [ ]:
# 不改变原数组
n2 = np.sort(n1)
n2
In [ ]:
n1
In [ ]:
n3 = np.random.randint(0, 10, size=6)
n3
In [ ]:
n3.sort()
In [ ]:
n3
In [ ]:
x = np.arange(5)
y = np.arange(10, 20)
# save: 保存x.npy
np.save('x', x)
# savez
np.savez('arr.npz', xarr=x, yarr=y)
In [ ]:
# 读取npy文件
np.load('x.npy')
# 读取npz文件
np.load('arr.npz')['xarr']
In [ ]:
n = np.random.randint(0, 10, size=(3, 4))
n
In [ ]:
# 存储到csv或txt
# delimiter=',': 分隔符
np.savetxt('arr.csv', n, delimiter=',')
In [ ]:
# 读取csv或txt
np.loadtxt('arr.csv', delimiter=',', dtype=np.int16)
Jupyter:02_Numpy课程代码 - Jupyter Notebook