前言
Python3的NumPy学习笔记
下载依赖
引入依赖
创建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的数组
生成元素全是0的数组
生成元素全是指定值的数组
<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获取指定数据
生成二维数组
将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>:指定行和列的长度
数据类型
| 数据类型 |
数据类型代码 |
备注 |
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 |
f4、f |
32位浮点数 |
float64 |
f8、d |
64位浮点数 |
float128 |
f16、g |
128位浮点数 |
complex64 |
c8、c16 |
|
complex128 |
c32 |
|
complex256 |
|
|
bool |
? |
|
object |
O |
|
string_ |
S |
|
unicode_ |
U |
|
数组对象的取值
普通取值
一维数组
获取一个值
获取一组值
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)]
|
数组对象的属性
数组长度
数组形状
- 可以判断是一维数组还是二维数组
- 可以得到每一个维度的数组的数组长度
数组的维度
数组内元素数据类型
数组内每个元素占用的内存空间
数组所有元素总计占用的内存空间
数组对象的方法
保留小数
<num>:保留的小数位数
1
| np.round(ndarray_object, <num>)
|
求和
求平均数
axis=<num>:指定轴编号
求最大值
求最小值
求标准差
求方差
求累计和
排序
转换组数元素的数据类型
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
| 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类的属性
派
NumPy类的方法
求和
求平均数
axis=<num>:指定轴编号
求最大值
求最小值
求标准差
求方差
求中位数
1
| np.median(ndarray_object)
|
求累计和
1
| np.cumsum(ndarray_object)
|
排序
求4分位数
求1/4位数
1
| q1 = np.percentile(ndarray_object, 0.25)
|
求3/4位数
1
| q3 = np.percentile(ndarray_object, 0.75)
|
求四分位距离
求疑似异常值(离群点)
通过数值判定法求疑似异常值
$ 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
判定数组中是否有True
根据条件摘取数据
根据单个条件
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
|
一元函数
| 函数名 |
备注 |
abs、fabs |
求绝对值 |
sqrt |
求平方根 |
square |
求平方 |
exp |
计算e的指数 |
log |
计算以e为底的对数 |
log10 |
计算以10为底的对数 |
log2 |
计算以2为底的对数 |
sign |
符号函数,1正数,0零,-1负数 |
ceil |
向下取整 |
floor |
向上取整 |
rint、rount |
四舍五入 |
isnan |
判断是否不为数值,True是NaN,False是非NaN |
isfinite、isinf |
判断是否为无穷大 |
cos、cosh、sin |
三角函数 |
sinh、tan、tanh |
三角函数 |
arccos、arccosh、arcsin |
反三角函数 |
arcsinh、arctan、arctanh |
反三角函数 |
二元函数
| 函数名 |
备注 |
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
| m = np.asmatrix(ndarray_object)
|
矩阵对象的属性
获取矩阵的数组
获取矩阵的一维数组
获取矩阵的转置
获取逆矩阵
- 逆矩阵:对角线是1,其他位置是0
- 奇异矩阵:没有逆矩阵的矩阵,奇异矩阵的行列式的值为0
矩阵对象的矩阵运算
矩阵乘法
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 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.matrix_rank(m)
|
完成
参考文献
哔哩哔哩——骆昊jackfrued