Numpy Quickstar
0. 环境介绍
环境使用 Kaggle 里免费建立的 Notebook
教程使用 B 站 一位 UP 的 10分钟学会Numpy,然后我在此基础上做了一点补充。
小技巧:当遇到函数看不懂的时候可以按 Shift+Tab
查看函数详解。
1. 导入 numpy
# 如果是在自己电脑上进行操作,没有 numpy 可以使用以下命令安装模块
# !pip install numpy
import numpy as np
2. array 的创建
2.1 np.array()
np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
2.2 np.zeros 和 np.zeros_like()
创建一个全零矩阵:
np.zeros((3, 3))
创建一个指定矩阵相同形状的全零矩阵,下面的例子中 np.zeros_like(a)
就是创建一个与 a
矩阵相同形状的全零矩阵:
a = np.array([[1, 2, 3],
[4, 5, 6]])
np.zeros_like(a)
2.3 np.ones() 和 np.ones_like()
创建一个全 1 矩阵:
np.ones((3, 3))
创建一个指定矩阵相同形状的全 1 矩阵,下面的例子中 np.ones_like(a)
就是创建一个与 a
矩阵相同形状的全 1 矩阵,与 np.zeros_like()
的用法类似:
a = np.array([[1, 2, 3],
[4, 5, 6]])
np.ones_like(a)
2.4 np.empty() 和 np.empty_like()
不像 np.zeros()
和 np.ones()
创建矩需要用 0 和 1 进行初始值,np.empty()
不进行初始化,因此运行起来可能要快一点;
np.empty()
创建出来的矩阵中的值是无意义的数据,每次创建的值可能不一样:
np.empty((2, 3))
np.empty_like()
用法和与 np.zeros_like()
和 np.ones_like()
类似,就不赘述了。
2.5 np.full() 和 np.full_like()
np.full((3, 2), 0.5)
若指定的维度为一个标量,则输出
1
×
标
量
值
1\times 标量值
1×标量值 的 array:
np.full(3, 2), np.full((3,), 2)
np.full_like()
用法与上面一致,不过多赘述。
2.6 np.eye()
创建一个单位矩阵:
np.eye(4)
2.7 np.arange()
创建一个 arrary,从 10 10 10 开始迭代,范围 [ 10 , 20 ) [10, 20) [10,20),步长为 2 2 2:
np.arange(10, 20, 2)
2.8 np.linspace()
创建一个 arrary,将 [ 10 , 20 ] [10, 20] [10,20] 分成 5 5 5 个值的等差数列:
np.linspace(10, 20, 5)
2.9 np.logspace()
创建一个 arrary,将 [ 1 0 0 , 1 0 3 ] [10^0, 10^3] [100,103] 分成 4 4 4 个值的等比数列:
np.logspace(0, 3, 4, base=10)
2.10 np.diag()
若对矩阵使用,取对角线:
np.diag([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
若对 arrary 使用,创建 arrary 维的对角矩阵,其对角线为 arrary 中的数:
np.diag([1, 2, 3])
2.11 np.tri()
创建一个下三角为 1 的矩阵:
np.tri(3)
2.12 np.vander()
生成特定的范德蒙数组:
np.vander([1, 2, 3, 4, 5])
2.13 np.arange()
给定数值范围生成 array:
np.arange(12)
3. array 属性
3.0 用于展示的例子
a = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10,11,12]])
a
3.1 shape
array 的形状:
a.shape
3.2 size
array 的元素个数:
a.size
3.3 T
array 的转置:
a.T
3.4 real 和 imag
array 的实部和虚部(因为全是实数所以虚部都为 0):
a.real, a.imag
4. array 操作
4.0 用于展示的例子
a = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10,11,12]])
a
4.1 copy()
不用 copy()
,直接使用 =
赋值后的结果:
# 直接赋值给 a_cp
a_cp = a
# 更改
a_cp[0, 0] = 99
a, a_cp
修改数组 a_cp
,原数组 a
同时发生改变。
使用 copy()
后的结果:
a_cp = a.copy()
a_cp[0, 0] = 99
a, a_cp
修改数组 a_cp
,原数组 a
不变。
与 pytorch 对比: pytorch 中的 tensor 变量可以使用
clone()
实现 numpy 中copy()
相同的效果。
4.2 reshape()
改变数组的形状:
a.reshape(2, 6)
4.3 resize()
改变数组的形状,和 reshape()
不同,resize()
直接改变原数组,没有返回值;
reshape()
不会改变原数组,而是返回一个原数组改变形状后的的 copy()
:
a.resize(2, 6), a
4.4 flatten()
将 array 拉平为一个向量:
a, a.flatten()
4.5 max(), min(), mean(), var(), std()
求数组的的最大值,最小值,平均数,方差,标准差:
a.max(), a.min(), a.mean(), a.var(), a.std()
还可以指定维度 axis
:
a.max(axis=0), a.min(axis=1, keepdims=True), a.mean(axis=0), a.var(axis=1), a.std(axis=1)
keepdims=True
参数可以使数组保持原来的维度输出。
5. array 索引
5.0 用于展示的例子
a = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10,11,12]])
a
5.1 切片
想要在每个维度上取得得索引用 :
隔开,:
之前缺省为
0
0
0,:
之后缺省为该维度的长度;索引 b:e
的取值范围为 [b, e)
a, a[0:3, 0:2], a[-2:,:2]
5.2 键对索引
a, a[1, 1], a[[1, 2], [1, 3]]
5.3 np.ix_()
有时候我们想取自定义列和自定义行的数据怎么办?
假设想取行索引为
1
1
1 和
2
2
2 ,列索引为
1
1
1 和
3
3
3 的数据。
通过 5.2 节可以看到 a[[1, 2], [1, 3]]
这样取值是不行的,这时候就得用 ix_()
函数:
a, a[np.ix_([1, 2], [1, 3])]
5.4 np.nditer()
nditer()
可以用于迭代:
print(a)
for i in a:
print(i, end=' ')
print('\n')
for i in np.nditer(a):
print(i, end=' ')
print('\n')
for i in np.nditer(a, order='F'):
print(i, end=' ')
order='F'
参数可以定义以不同的顺序读取。
6. array 的拼接拆分
6.0 用于展示的例子
a = np.arange(12).reshape(3, 4)
b = np.arange(0, 120, 10).reshape(3, 4)
a, b
6.1 vstack()
v 指的是 vertical(垂直),将矩阵在垂直方向上拼接起来:
np.vstack([a, b])
6.2 hstack()
h 指的是 horizontal(水平),将矩阵在水平方向上拼接起来:
np.hstack([a, b])
6.3 stack()
在指定维度上进行拼接:
c = np.stack([a, b], axis=1)
c, c.shape
axis
参数用于指定在哪个维度进行堆叠,缺省为
0
0
0。
6.4 vsplit()
垂直方向上拆分 array 为指定的份数:
d = np.arange(16).reshape(4, 4)
d, np.vsplit(d, 2)
**补充:**要注意
vsplit()
,hsplit()
,split()
的返回值是 python 的 list。
6.5 hsplit()
水平方向上拆分 array 为指定的份数:
d, np.hsplit(d, 2)
6.6 split()
指定维度上对 array 拆分为指定的份数:
d, np.split(d, 2, axis=1)
7. 数学和统计函数
7.1 三角函数
不限于下面这些:
np.sin(10), np.cos(10), np.tan(10)
7.2 数学函数
不限于下面这些:
np.exp(1), np.log(np.e), np.log2(16)
7.2 argmax() 和 argmin()
argmax()
和 argmin()
分别表示沿给定维度返回最大和最小元素的索引:
t = np.array([[2, 1, 3],
[4, 9, 0],
[15,8, 7]])
t, np.argmax(t, axis=1), np.argmin(t, axis=1)
7.3 amin() 和 amax(),max() 和 min()
amin()
和 amax()
实现的效果与 max()
和 min()
一样:
t, np.max(t, axis=1, keepdims=True), np.amax(t, axis=1, keepdims=True)
t, np.min(t, axis=1, keepdims=True), np.amin(t, axis=1, keepdims=True)
7.4 ptp()
计算数组中元素最大值与最小值的差(可以指定维度):
t, np.ptp(t), np.ptp(t, axis=0), np.ptp(t, axis=1)
7.5 percentile() 和 nanpercentile()
计算数组中的指定的分位数(可以指定维度):
指定
50
50
50 表示计算中位数:
a, np.percentile(a, 50), np.percentile(a, 50, axis=1)
当数组中有 np.nan
值时使用 nanpercentile()
即可。
7.6 median(), mean(), std(), var()
median() mean(), std(), var()
分别表示计算数组的中位数,平均值,标准差,方差(都可以指定维度):
a, np.median(a), np.mean(a, axis=0), np.std(a), np.var(a, axis=1, keepdims=True)
7.7 average()
可以指定权重,计算数组加权平均值:
k = np.array([1, 2, 3, 4])
wts = np.array([4, 3, 2, 1])
k, np.average(k), np.average(k, weights=wts), (1*4+2*3+3*2+4*1)/(4+3+2+1)