【笔记】NumPy学习笔记

前言

Python3的NumPy学习笔记

下载依赖

1
pip3 install numpy

引入依赖

1
import numpy as np

创建ndarray对象

生成一维数组

将Python列表转换位数组对象

1
2
3
arr = []

ndarray_object = np.array(arr)

生成一个有序数列数组

1
ndarray_object = np.arange(<start>, <end>)
1
ndarray_object = np.arange(<start>, <end>, <step>)
手动指定数组内元素数据类型
1
ndarray_object = np.arange(<start>, <end>, dtype=np.int64)
1
ndarray_object = np.arange(<start>, <end>, dtype="i8")

生成一个指定范围的有序数列数组

  • 步长会自动根据数据个数和范围确定

<num_start>:生成数据的起始值
<num_end>:生成数据的结束值
<num_count>:生成数据的个数

1
ndarray_object = np.linspace(<num_start>, <num_end>, <num_count>)

生成随机数数组

生成范围为[0,1)的随机数

<num_count>:生成数据的个数

1
ndarray_object = np.random.random(<num_count>)
生成指定范围的随机整数
  • 生成范围为[,)的随机数
1
ndarray_object = np.random.randint(<num_start>, <num_end>, <num_count>)

生成相同数据填充的数组

生成元素全是0的数组
1
np.zeros(<num_count>)
生成元素全是0的数组
1
np.ones(<num_count>)
生成元素全是指定值的数组

<num>:被填充的值

1
np.full(<num>, <num_count>)

生成正态分布数据的数组

<mu>:μ
<sigma>:σ
<num_count>:生成数据的个数

1
ndarray_object = np.random.normal(<mu>, <sigma>, <num_count>)

从迭代器对象创建数组

<generator_object>:迭代器对象
dtype=np.int64:定义数据类型

1
ndarray_object = np.fromiter(<generator_object>, dtype=np.int64)

利用正则表达式从文本中抽取数据创建数组

r"\d+":定义正则表达式
<key>:为这个数据定义key

1
ndarray_object = np.fromregex(<text>, r"\d+", dtype=[("<key>", np.int64)])
利用数据的key获取指定数据
1
ndarray_object["<key>"]

生成二维数组

将Python列表转换为数组对象

  • 在ndarray对象中,如果是二维数组
    • 对最外层数组的计算作为针对于0轴计算
    • 对最内层数组的计算作为针对于1轴计算
1
2
3
arr = [[], [], []]

ndarray_object = np.array(arr)

将一维数组转换为二维数组

  • 转换形状转换前后数据数必须保持一致,无论超出还是不足都会报错

2:行
3:列

1
2
3
ndarray_object = np.array([1, 2, 3, 4, 5, 6])

ndarray_object = ndarray_object.reshape(2, 3)
将二维数组转换为一维数组

6:列

1
2
3
ndarray_object = np.array([[1, 2, 3], [4, 5, 6]])

ndarray_object = ndarray_object.reshape(6,)

生成随机数数组

<num_start>:生成数据的起始值
<num_end>:生成数据的结束值
<num_row>:行数
<num_col>:列数

1
ndarray_object = np.random.randint(<num_start>, <num_end>, (<num_row>, <num_col>))

生成相同数据填充的数组

生成元素全是0的数组
1
np.zeros((<num_row>, <num_col>))
生成元素全是0的数组
1
np.ones((<num_row>, <num_col>))
生成元素全是指定值的数组

<num>:被填充的值

1
np.full(<num>, (<num_row>, <num_col>))
生成矩阵数组
  • 矩阵的行和列的长度是相同的
  • 对角线是1,其他位置全是0

<num>:指定行和列的长度

1
np.eye(<num>)

数据类型

数据类型 数据类型代码 备注
int8 i1 8位有符号整数
uint8 u1 8位有符号整数
int16 i2 16位有符号整数
uint16 u2 16位有符号整数
int32 i4 32位有符号整数
uint32 u4 32位有符号整数
int64 i8 64位有符号整数
uint64 u8 64位有符号整数
float16 f2 16位浮点数
float32 f4f 32位浮点数
float64 f8d 64位浮点数
float128 f16g 128位浮点数
complex64 c8c16
complex128 c32
complex256
bool ?
object O
string_ S
unicode_ U

数组对象的取值

普通取值

一维数组

获取一个值
1
ndarray_object[<index>]
获取一组值
1
ndarray_object[<index_start>:<index_end>]

二维数组

获取一个值
1
ndarray_object[<index_row>, <index_col>]
获取一组值
1
ndarray_object[<index_row_start>:<index_row_end>, <index_col_start>:<index_col_end>]
返回为二维数组的一维数组
1
ndarray_object[<index_row>,:]

花式索引取值(Fancy Index)

  • 返回一个新的数组对象
  • 可以反复取指定下标的值

一维数组

1
new_ndarray_object = ndarray_object[[<index_1>, <index_2>, <index_1>]]

二维数组

1
new_ndarray_object = ndarray_object[[<index_row_start>, <index_col_start>], [<index_row_end>, <index_col_end>]]

布尔索引

  • 筛选出满足条件的值返回一个新的数组对象
  • 使用布尔索引时维度会坍塌,只能返回一维的数组对象
1
new_ndarray_object = ndarray_object[[True, False, True, False]]
1
new_ndarray_object = ndarray_object[ndarray_object % 2 != 0]

1
new_ndarray_object = ndarray_object[(ndarray_object % 2 != 0) & (ndarray_object % 3 != 0)]

1
new_ndarray_object = ndarray_object[(ndarray_object % 2 != 0) | (ndarray_object % 3 != 0)]

1
new_ndarray_object = ndarray_object[~(ndarray_object % 2 != 0)]

数组对象的属性

数组长度

1
ndarray_object.size

数组形状

  • 可以判断是一维数组还是二维数组
  • 可以得到每一个维度的数组的数组长度
1
ndarray_object.shape

数组的维度

1
ndarray_object.ndim

数组内元素数据类型

1
ndarray_object.dtype

数组内每个元素占用的内存空间

  • 单位字节
1
ndarray_object.itemsize

数组所有元素总计占用的内存空间

  • 单位字节
1
ndarray_object.nbytes

数组对象的方法

保留小数

  • 四舍五入保留小数

<num>:保留的小数位数

1
np.round(ndarray_object, <num>)

求和

1
ndarray_object.sum()

求平均数

axis=<num>:指定轴编号

1
ndarray_object.mean()

求最大值

1
ndarray_object.max()

求最小值

1
ndarray_object.min()

求标准差

1
ndarray_object.std()

求方差

1
ndarray_object.var()

求累计和

1
ndarray_object.cumsum()

排序

  • 直接在原数组中重新排序
1
ndarray_object.sort()

转换组数元素的数据类型

  • 返回新的数组对象

np.float64:转换后的数据类型

1
new_ndarray_object = ndarray_object.astype(np.float64)

填充

  • 直接在原数组中填充
1
ndarray_object.fill(<data>)

返回非0元素的位置

1
new_ndarray_object = ndarray_object.nonzero()

多维数组转换为一维数组(扁平化)

  • 返回新的数组对象

行优先

1
new_ndarray_object = ndarray_object.flatten()

列优先

1
new_ndarray_object = ndarray_object.flatten('F')

矩阵的转置

1
ndarray_object.transpose()

交换轴

1
ndarray_object.swapaxes(<num_1>, <num_2>)

通过交换轴实现矩阵的转置

1
ndarray_object.swapaxes(0, 1)

还原数组对象为Python列表

1
new_ndarray_object = ndarray_object.tolist()

数组元素的去重

  • 直接在原数组中去除重复元素
1
ndarray_object.unique()

拷贝数组

  • 返回新的数组对象
1
new_ndarray_object = ndarray_object.copy()

堆叠数组

在水平方向堆叠,不改变深度

1
new_ndarray_object = np.hstack((ndarray_object_1, ndarray_object_2))
1
new_ndarray_object = np.concatenate((ndarray_object_1, ndarray_object_2), axis=0)

在垂直方向堆叠,不改变深度

1
new_ndarray_object = np.vstack((ndarray_object_1, ndarray_object_2))
1
new_ndarray_object = np.concatenate((ndarray_object_1, ndarray_object_2), axis=1)

在水平方向堆叠,改变深度

1
new_ndarray_object = np.stack((ndarray_object_1, ndarray_object_2), axis=0)

在垂直方向堆叠,改变深度

1
new_ndarray_object = np.stack((ndarray_object_1, ndarray_object_2), axis=1)

拆分数组

在水平方向拆分

1
new_ndarray_object = np.vsplit(ndarray_object, <num>)
1
new_ndarray_object = np.split(ndarray_object, <num>, axis=0)

在垂直方向拆分

1
new_ndarray_object = np.hsplit(ndarray_object, <num>)
1
new_ndarray_object = np.split(ndarray_object, <num>, axis=1)

NumPy类的属性

1
np.pi

NumPy类的方法

求和

1
np.sum(ndarray_object)

求平均数

axis=<num>:指定轴编号

1
np.mean(ndarray_object)

求最大值

1
np.amax(ndarray_object)

求最小值

1
np.amin(ndarray_object)

求标准差

1
np.std(ndarray_object)

求方差

1
np.var(ndarray_object)

求中位数

1
np.median(ndarray_object)

求累计和

1
np.cumsum(ndarray_object)

排序

  • 返回重新排序的新数组
1
np.sort(ndarray_object)

求4分位数

求1/4位数

1
q1 = np.percentile(ndarray_object, 0.25)

求3/4位数

1
q3 = np.percentile(ndarray_object, 0.75)

求四分位距离

1
iqr = q3 - q1

求疑似异常值(离群点)

通过数值判定法求疑似异常值

$ data < Q_1 - 1.5 \times IQR $

$ data < Q_3 + 1.5 \times IQR $

whis:判定异常值范围的系数

1.5:默认值

1
2
3
q1, q3 = np.percentile(ndarray_object, [0.25, 0.75])
iqr = q3 - q1
outliers = ndarray_object[(ndarray_object < q1 - whis * iqr) | (ndarray_object > q3 + whis * iqr)]
通过Z-score判定法求疑似异常值

threshold:判定异常值范围的系数

3:默认值

1
2
mu, sigma = np.mean(ndarray_object), np.std(ndarray_object)
outliers = ndarray_object[np.abs((ndarray_object - mu) / sigma) > threshold]

重复

<num>:重复次数

每个元素重复生成组成新数组

1
np.repeat(ndarray_object, <num>)
1
array([1, 1, 2, 2, 3, 3])

整组元素重复生成组成新数组

1
np.tile(ndarray_object, <num>)
1
array([1, 2, 3, 1, 2, 3])

添加元素

数组末尾追加元素

  • 返回新的数组对象
1
np.append(ndarray_object, <data>)

数组指定位置插入元素

  • 返回新的数组对象
1
np.insert(ndarray_object, <index>, <data>)

判定布尔值

判定数组中是否全是True

1
np.all(ndarray_object)

判定数组中是否有True

1
np.any(ndarray_object)

根据条件摘取数据

  • 返回新的数组对象

根据单个条件

1
new_ndarray_object = ndarray_object[筛选条件]
1
new_ndarray_object = np.extract(筛选条件, ndarray_object)
1
new_ndarray_object = np.where(筛选条件, 满足筛选条件的操作, 没有满足筛选条件的操作)

根据多个条件

1
new_ndarray_object = np.select([筛选条件1, 筛选条件2], [满足第1个筛选条件后执行的操作, 满足第2个筛选条件后执行的操作], 没有满足任何条件执行的操作)

调整数组长度

  • 调整数组形状的同时调整数组长度
  • 返回新的数组对象

<shape>:新的形状,如果新的形状的长度大于旧的数组长度,则超出部分会重复使用原数组元素补齐

1
np.resize(ndarray_object, <shape>)

求最小二乘解

  • 最小二乘解,得到斜率和截距
1
result = np.linalg.lstsq(ndarray_object_1, ndarray_object_2)
  • 多项式最小二乘拟合
1
result = np.polyfit(ndarray_object_1, ndarray_object_2, <degree>)

数组的运算

数组对象与标准数值运算

  • 将所有元素与标准数值运算,得到新数组对象
1
new_ndarray_object = ndarray_object + <data>
1
new_ndarray_object = ndarray_object - <data>
1
new_ndarray_object = ndarray_object * <data>
1
new_ndarray_object = ndarray_object / <data>
1
new_ndarray_object = ndarray_object % <data>
1
new_ndarray_object = ndarray_object ** <data>

数组对象与数组对象运算

  • 将当前数组的所有元素与另一个数组的所有元素运算,得到新数组对象
1
new_ndarray_object = ndarray_object_1 + ndarray_object_2
1
new_ndarray_object = ndarray_object_1 - ndarray_object_2
1
new_ndarray_object = ndarray_object_1 * ndarray_object_2
1
new_ndarray_object = ndarray_object_1 / ndarray_object_2
1
new_ndarray_object = ndarray_object_1 % ndarray_object_2
1
new_ndarray_object = ndarray_object_1 ** ndarray_object_2

一元函数

函数名 备注
absfabs 求绝对值
sqrt 求平方根
square 求平方
exp 计算e的指数
log 计算以e为底的对数
log10 计算以10为底的对数
log2 计算以2为底的对数
sign 符号函数,1正数,0零,-1负数
ceil 向下取整
floor 向上取整
rintrount 四舍五入
isnan 判断是否不为数值,True是NaN,False是非NaN
isfiniteisinf 判断是否为无穷大
coscoshsin 三角函数
sinhtantanh 三角函数
arccosarccosharcsin 反三角函数
arcsinharctanarctanh 反三角函数

二元函数

函数名 备注
add 求和
subtract 求差
multiply 求积
divide 求商
floor_divide 整除
mod 求模
allclose 两个数组是否相等
power 求x的y次幂
maximum 求最大值
fmum 求最大值,忽略NaN
minimum 求最小值
fmin 求最小值,忽略NaN
dot 点积运算
inner 内积运算
cross 叉积运算
outer 外积运算
intersect1d 计算交集
union1d 计算并集
setdiff1d 计算差集
setxor1d 计算对称差集
in1d 返回x的值在y中是否存在,返回布尔值

广播机制

  • 两个数组作运算需要保证形状相同
  • 如果两个数组的后缘维度相同,也可以正常运算,其他维度广播
  • 如果两个数组的后缘维度不同,但其中一方后缘维度为1,也可以正常运算,沿着为1的维度广播

点积运算

  • 计算向量的夹角,用于判定数据相似度

$$
A \cdot B = \sum a_ib_i
$$

$$
A \cdot B = |A||B|cos\theta
$$

1
2
3
4
5
6
7
8
9
x = np.array([1, 2, 3])
y = np.array([2, 4, 6])

# 计算向量夹角余弦值
result = np.dot(x, y) / np.linalg.norm(x) / np.linalg.norm(y)
# 计算向量夹角弧度
np.arccos(result)
# 计算向量夹角角度
np.rad2deg(np.arccos(result))

矩阵

  • 官方不再建议使用矩阵对象,可能会在将来的版本删除矩阵对象,推荐使用二维数组表示矩阵

定义矩阵

1
m = np.matrix("1 2; 3 4")

数组转换为矩阵

1
np.mat(ndarray_object)
1
m = np.asmatrix(ndarray_object)

矩阵对象的属性

获取矩阵的数组

1
m.A

获取矩阵的一维数组

1
m.A1

获取矩阵的转置

1
m.T

获取逆矩阵

  • 逆矩阵:对角线是1,其他位置是0
  • 奇异矩阵:没有逆矩阵的矩阵,奇异矩阵的行列式的值为0
1
m.I

矩阵对象的矩阵运算

矩阵乘法

  • m1的列数等于m2的行数才能进行矩阵乘法运算
1
2
3
4
m1 = np.matrix("1 2; 3 4; 5 6")
m2 = np.matrix("1 2 3; 4 5 6")

m = m1 * m2
计算单位矩阵
  • 单位矩阵:矩阵的逆矩阵与矩阵相乘

$$
A \cdot A^{-1} = I
$$

1
result = m * m.I

数组对象的矩阵运算

矩阵乘法

1
2
3
4
ndarray_object_1 = np.array([[1, 2], [3, 4], [5, 6]])
ndarray_object_2 = np.array([[1, 2, 3], [4, 5, 6]])

result = ndarray_object_1 @ ndarray_object_2

求逆矩阵

1
result = np.linalg.inv(ndarray_object)

解线性方程组

A:系数矩阵
Ab:增广矩阵

1
result = np.linalg.solve(A, b)

矩阵对象的方法

计算矩阵的行列式

1
np.linalg.det(m)

计算矩阵的秩

  • 秩:线性无关的向量的个数
  • 满秩:矩阵行数等于秩
  • 非满秩:矩阵行数不等于秩
1
np.linalg.matrix_rank(m)

完成

参考文献

哔哩哔哩——骆昊jackfrued