站长之家查询的网址,网站备案幕布怎么申请,中企动力科技股份有限公司招聘,一起做网店网站哪里进货的专栏介绍
结合自身经验和内部资料总结的Python教程#xff0c;每天3-5章#xff0c;最短1个月就能全方位的完成Python的学习并进行实战开发#xff0c;学完了定能成为大佬#xff01;加油吧#xff01;卷起来#xff01;
全部文章请访问专栏#xff1a;《Python全栈教…专栏介绍
结合自身经验和内部资料总结的Python教程每天3-5章最短1个月就能全方位的完成Python的学习并进行实战开发学完了定能成为大佬加油吧卷起来
全部文章请访问专栏《Python全栈教程0基础》 再推荐一下最近热更的《大厂测试高频面试题详解》 该专栏对近年高频测试相关面试题做详细解答结合自己多年工作经验以及同行大佬指导总结出来的。旨在帮助测试、python方面的同学顺利通过面试拿到自己满意的offer 文章目录 专栏介绍NumPy进阶应用数组的运算数组跟标量的运算数组跟数组的运算通用一元函数通用二元函数广播机制 其他常用函数矩阵运算线性代数快速回顾NumPy中矩阵相关函数NumPy的线性代数模块 NumPy进阶应用
数组的运算
使用 NumPy 最为方便的是当需要对数组元素进行运算时不用编写循环代码遍历每个元素所有的运算都会自动的矢量化使用高效的、提前编译的底层代码来对数据序列进行数学操作。简单的说就是NumPy 中的数学运算和数学函数会自动作用于数组中的每个成员。
数组跟标量的运算
代码
array35 np.arange(1, 10)
print(array35 10)
print(array35 * 10)输出
[11 12 13 14 15 16 17 18 19]
[10 20 30 40 50 60 70 80 90]数组跟数组的运算
代码
array36 np.array([1, 1, 1, 2, 2, 2, 3, 3, 3])
print(array35 array36)
print(array35 * array36)
print(array35 ** array36)输出
[ 2 3 4 6 7 8 10 11 12]
[ 1 2 3 8 10 12 21 24 27]
[ 1 2 3 16 25 36 343 512 729]通用一元函数
通用函数是对ndarray中的数据执行元素级运算的函数。你可以将其看做普通函数接收一个标量值作为参数返回一个标量值的矢量化包装器如下所示。
代码
print(np.sqrt(array35))
print(np.log2(array35))输出
[1. 1.41421356 1.73205081 2. 2.23606798 2.449489742.64575131 2.82842712 3. ]
[0. 1. 1.5849625 2. 2.32192809 2.58496252.80735492 3. 3.169925 ]表1通用一元函数
函数说明abs / fabs求绝对值的函数sqrt求平方根的函数相当于array ** 0.5 square求平方的函数相当于array ** 2exp计算 e x e^x ex的函数log / log10 / log2对数函数e为底 / 10为底 / 2为底sign符号函数1 - 正数0 - 零-1 - 负数ceil / floor上取整 / 下取整isnan返回布尔数组NaN对应True非NaN对应Falseisfinite / isinf判断数值是否为无穷大的函数cos / cosh / sin三角函数sinh / tan / tanh三角函数arccos / arccosh / arcsin反三角函数arcsinh / arctan / arctanh反三角函数rint / round四舍五入函数
通用二元函数
代码
array37 np.array([[4, 5, 6], [7, 8, 9]])
array38 np.array([[1, 2, 3], [3, 2, 1]])
print(array37 ** array38)
print(np.power(array37, array38))输出
[[ 4 25 216][343 64 9]]
[[ 4 25 216][343 64 9]]表2通用二元函数
函数说明add(x, y) / substract(x, y)加法函数 / 减法函数multiply(x, y) / divide(x, y)乘法函数 / 除法函数floor_divide(x, y) / mod(x, y)整除函数 / 求模函数allclose(x, y)检查数组x和y元素是否几乎相等power(x, y)数组 x x x的元素 x i x_i xi和数组 y y y的元素 y i y_i yi计算 x i y i x_i^{y_i} xiyimaximum(x, y) / fmax(x, y)两两比较元素获取最大值 / 获取最大值忽略NaNminimum(x, y) / fmin(x, y)两两比较元素获取最小值 / 获取最小值忽略NaNdot(x, y)点积运算数量积通常记为 ⋯ \cdots ⋯用于欧几里得空间Euclidean spaceinner(x, y)内积运算内积的含义要高于点积点积相当于是内积在欧几里得空间$$的特例而内积可以推广到赋范向量空间只要它满足平行四边形法则即可cross(x, y) 叉积运算向量积通常记为 × \times ×运算结果是一个向量outer(x, y)外积运算张量积通常记为 ⨂ \bigotimes ⨂运算结果通常是一个矩阵intersect1d(x, y)计算x和y的交集返回这些元素构成的有序数组union1d(x, y)计算x和y的并集返回这些元素构成的有序数组in1d(x, y)返回由判断x 的元素是否在y中得到的布尔值构成的数组setdiff1d(x, y)计算x和y的差集返回这些元素构成的数组setxor1d(x, y)计算x和y的对称差返回这些元素构成的数组 补充说明在二维空间内两个向量 A [ a 1 a 2 ] \boldsymbol{A}\begin{bmatrix} a_1 \\ a_2 \end{bmatrix} A[a1a2]和 B [ b 1 b 2 ] \boldsymbol{B}\begin{bmatrix} b_1 \\ b_2 \end{bmatrix} B[b1b2]的叉积是这样定义的 A × B ∣ a 1 a 2 b 1 b 2 ∣ a 1 b 2 − a 2 b 1 \boldsymbol{A}\times \boldsymbol{B}\begin{vmatrix} a_1 \quad a_2 \\ b_1 \quad b_2 \end{vmatrix}a_1b_2 - a_2b_1 A×B a1a2b1b2 a1b2−a2b1其中 ∣ a 1 a 2 b 1 b 2 ∣ \begin{vmatrix} a_1 \quad a_2 \\ b_1 \quad b_2 \end{vmatrix} a1a2b1b2 称为行列式。但是一定要注意叉积并不等同于行列式行列式的运算结果是一个标量而叉积运算的结果是一个向量。如果不明白我们可以看看三维空间两个向量 A [ a 1 a 2 a 3 ] \boldsymbol{A}\begin{bmatrix} a_1 \\ a_2 \\ a_3 \end{bmatrix} A a1a2a3 和 B [ b 1 b 2 b 3 ] \boldsymbol{B}\begin{bmatrix} b_1 \\ b_2 \\ b_3 \end{bmatrix} B b1b2b3 的叉积是 i ^ ∣ a 2 a 3 b 2 b 3 ∣ , − j ^ ∣ a 1 a 3 b 1 b 3 ∣ , k ^ ∣ a 1 a 2 b 1 b 2 ∣ \left \hat{i} \begin{vmatrix} a_2 \quad a_3 \\ b_2 \quad b_3 \end{vmatrix}, -\hat{j} \begin{vmatrix} a_1 \quad a_3 \\ b_1 \quad b_3 \end{vmatrix}, \hat{k} \begin{vmatrix} a_1 \quad a_2 \\ b_1 \quad b_2 \end{vmatrix} \right ⟨i^ a2a3b2b3 ,−j^ a1a3b1b3 ,k^ a1a2b1b2 ⟩其中 i ^ , j ^ , k ^ \hat{i}, \hat{j}, \hat{k} i^,j^,k^代表每个维度的单位向量。 广播机制
上面的例子中两个二元运算的数组形状是完全相同的我们再来研究一下两个形状不同的数组是否可以直接做二元运算或使用二元函数进行运算请看下面的例子。
代码
array39 np.array([[0, 0, 0], [1, 1, 1], [2, 2, 2], [3, 3, 3]])
array40 np.array([1, 2, 3])
array39 array40输出
array([[1, 2, 3],[2, 3, 4],[3, 4, 5],[4, 5, 6]])代码
array41 np.array([[1], [2], [3], [4]])
array39 array41输出
array([[1, 1, 1],[3, 3, 3],[5, 5, 5],[7, 7, 7]])通过上面的例子我们发现形状不同的数组仍然有机会进行二元运算但也绝对不是任意的数组都可以进行二元运算。简单的说只有两个数组后缘维度相同或者其中一个数组后缘维度为1时广播机制会被触发而通过广播机制如果能够使两个数组的形状一致才能进行二元运算。所谓后缘维度指的是数组shape属性对应的元组中最后一个元素的值从后往前数最后一个维度的值例如我们之前打开的图像对应的数组后缘维度为33行4列的二维数组后缘维度为4而有5个元素的一维数组后缘维度为5。简单的说就是后缘维度相同或者其中一个数组的后缘维度为1就可以应用广播机制而广播机制如果能够使得数组的形状一致就满足了两个数组对应元素做运算的需求如下图所示。 其他常用函数
除了上面讲到的函数外NumPy 中还提供了很多用于处理数组的函数ndarray对象的很多方法也可以通过直接调用函数来实现下表给出了一些常用的函数。
表3NumPy其他常用函数
函数说明unique去除数组重复元素返回唯一元素构成的有序数组copy返回拷贝数组得到的数组sort返回数组元素排序后的拷贝split / hsplit / vsplit将数组拆成若干个子数组stack / hstack / vstack将多个数组堆叠成新数组concatenate沿着指定的轴连接多个数组构成新数组append / insert向数组末尾追加元素 / 在数组指定位置插入元素argwhere找出数组中非0元素的位置extract / select / where按照指定的条件从数组中抽取或处理数组元素flip沿指定的轴翻转数组中的元素fromiter通过迭代器创建数组对象fromregex通过读取文件和正则表达式解析获取数据创建数组对象repeat / tile通过对元素的重复来创建新数组roll沿指定轴对数组元素进行移位resize重新调整数组的大小place / put将数组中满足条件的元素/指定的元素替换为指定的值partition用选定的元素对数组进行一次划分并返回划分后的数组 提示上面的resize函数和ndarray对象的resize方法是有区别的resize函数在调整数组大小时会重复数组中的元素作为填补多出来的元素的值而ndarry对象的resize方法是用0来填补多出来的元素。这些小细节不清楚暂时也不要紧但是如果用到对应的功能了就要引起注意。 代码
array42 np.array([[1, 1, 1], [2, 2, 2], [3, 3, 3]])
array43 np.array([[4, 4, 4], [5, 5, 5], [6, 6, 6]])
np.hstack((array42, array43))输出
array([[1, 1, 1, 4, 4, 4],[2, 2, 2, 5, 5, 5],[3, 3, 3, 6, 6, 6]])代码
np.vstack((array42, array43))输出
array([[1, 1, 1],[2, 2, 2],[3, 3, 3],[4, 4, 4],[5, 5, 5],[6, 6, 6]])代码
np.concatenate((array42, array43))输出
array([[1, 1, 1],[2, 2, 2],[3, 3, 3],[4, 4, 4],[5, 5, 5],[6, 6, 6]])代码
np.concatenate((array42, array43), axis1)输出
array([[1, 1, 1, 4, 4, 4],[2, 2, 2, 5, 5, 5],[3, 3, 3, 6, 6, 6]])矩阵运算
NumPy 中提供了专门用于线性代数linear algebra的模块和表示矩阵的类型matrix当然我们通过二维数组也可以表示一个矩阵官方并不推荐使用matrix类而是建议使用二维数组而且有可能在将来的版本中会移除matrix类。无论如何利用这些已经封装好的类和函数我们可以轻松愉快的实现线性代数中很多的操作。
线性代数快速回顾
向量也叫矢量是一个同时具有大小和方向且满足平行四边形法则的几何对象。与向量相对的概念叫标量或数量标量只有大小、绝大多数情况下没有方向。向量可以进行加、减、数乘、点积、叉积等运算。行列式由向量组成它的性质可以由向量解释。行列式可以使用行列式公式计算 d e t ( A ) ∑ n ! ± a 1 α a 2 β ⋯ a n ω det(\boldsymbol{A})\sum_{n!} \pm {a_{1\alpha}a_{2\beta} \cdots a_{n\omega}} det(A)∑n!±a1αa2β⋯anω。高阶行列式可以用代数余子式展开成多个低阶行列式如 d e t ( A ) a 11 C 11 a 12 C 12 ⋯ a 1 n C 1 n det(\boldsymbol{A})a_{11}C_{11}a_{12}C_{12} \cdots a_{1n}C_{1n} det(A)a11C11a12C12⋯a1nC1n。矩阵是由一系列元素排成的矩形阵列矩阵里的元素可以是数字、符号或数学公式。矩阵可以进行加法、减法、数乘、乘法、转置等运算。逆矩阵用 A − 1 \boldsymbol{A^{-1}} A−1表示 A A − 1 A − 1 A I \boldsymbol{A}\boldsymbol{A^{-1}}\boldsymbol{A^{-1}}\boldsymbol{A}\boldsymbol{I} AA−1A−1AI没有逆矩阵的方阵是奇异矩阵。如果一个方阵是满秩矩阵(矩阵的秩等于矩阵的阶数)该方阵对应的线性方程有唯一解。 说明矩阵的秩是指矩阵中线性无关的行/列向量的最大个数同时也是矩阵对应的线性变换的像空间的维度。 NumPy中矩阵相关函数 创建矩阵对象。 代码 # matrix构造函数可以传入类数组对象也可以传入字符串
m1 np.matrix(1 2 3; 4 5 6)
m1输出 matrix([[1, 2, 3],[4, 5, 6]])代码 # asmatrix函数也可以写成mat函数它们其实是同一个函数
m2 np.asmatrix(np.array([[1, 1], [2, 2], [3, 3]]))
m2输出 matrix([[1, 1],[2, 2],[3, 3]])代码 m1 * m2输出 matrix([[14, 14],[32, 32]])说明注意matrix对象和ndarray对象乘法运算的差别如果两个二维数组要做矩阵乘法运算应该使用运算符或matmul函数而不是*运算符。 矩阵对象的属性。 属性说明A获取矩阵对象对应的ndarray对象A1获取矩阵对象对应的扁平化后的ndarray对象I可逆矩阵的逆矩阵T矩阵的转置H矩阵的共轭转置shape矩阵的形状size矩阵元素的个数 矩阵对象的方法。
矩阵对象的方法跟之前讲过的ndarray数组对象的方法基本差不多此处不再进行赘述。
NumPy的线性代数模块
NumPy 的linalg模块中有一组标准的矩阵分解运算以及诸如求逆和行列式之类的函数它们跟 MATLAB 和 R 等语言所使用的是相同的行业标准线性代数库下面的表格列出了numpy以及linalg模块中常用的跟线性代数相关的函数。
函数说明diag以一维数组的形式返回方阵的对角线元素或将一维数组转换为方阵非对角元素元素为0vdot向量的点积dot数组的点积inner数组的内积outer数组的叉积trace计算对角线元素的和norm求模范数运算det计算行列式的值在方阵上计算会得到一个标量matrix_rank计算矩阵的秩eig计算矩阵的特征值eigenvalue和特征向量eigenvectorinv计算非奇异矩阵 n n n阶方阵的逆矩阵pinv计算矩阵的摩尔-彭若斯Moore-Penrose广义逆qrQR分解把矩阵分解成一个正交矩阵与一个上三角矩阵的积svd计算奇异值分解singular value decompositionsolve解线性方程组 A x b \boldsymbol{A}\boldsymbol{x}\boldsymbol{b} Axb其中 A \boldsymbol{A} A是一个方阵lstsq计算 A x b \boldsymbol{A}\boldsymbol{x}\boldsymbol{b} Axb的最小二乘解
大家如果有兴趣可以用下面的代码验证上面的函数。
代码
m3 np.array([[1., 2.], [3., 4.]])
np.linalg.inv(m3)输出
array([[-2. , 1. ],[ 1.5, -0.5]])代码
m4 np.array([[1, 3, 5], [2, 4, 6], [4, 7, 9]])
np.linalg.det(m4)输出
2代码
# 解线性方程组axb
# 3*x1 x2 9x1 2*x2 8
a np.array([[3,1], [1,2]])
b np.array([9, 8])
np.linalg.solve(a, b)输出
array([2., 3.])