numpy.linalg学习

本文详细介绍了使用NumPy进行矩阵和向量运算的方法,包括点积、矩阵乘法、求解逆矩阵及最小二乘法等内容,并提供了丰富的实例代码。

1、矩阵和向量积

  • 两个数组点积:numpy.dot(a, b, out=None)
①a、b都是常量或一维数组,则返回标量
In [1]: import numpy as np

In [2]: np.dot(3,4)
Out[2]: 12

In [3]: np.dot([1,2,3],[4,5,6])
Out[3]: 32
知识点:对于一维数组,其结果等于两向量的内积:设向量 a=(x1,y1),向量b=(x2,y2),结果等于x1*x2+y1*y2
②a、b都是二维数组,相当于矩阵的乘法
In [5]: a = np.array([[1,2],[3,4],[2,5]])
   ...: b = np.array([[2,3,1],[4,5,2]])
   ...: np.dot(a,b)
   ...:
Out[5]:
array([[10, 13,  5],
       [22, 29, 11],
       [24, 31, 12]])
知识点:矩阵乘法,第一矩阵A的行数必须等于第二个矩阵B的列数;矩阵A乘以矩阵B得到的结果C,其第m行n列元素等于矩阵A的第m行元素乘以矩阵B第n列对应元素之和
③a、b都是N维,其结果等于a的最后一轴和b的倒数第二轴积之和
In [3]: import numpy as np

In [4]: a = np.array(range(12)).reshape(2,3,1,2)
   ...: b = np.array(range(12)).reshape(3,2,2)
   ...:

In [5]: a
Out[5]:
array([[[[ 0,  1]],

        [[ 2,  3]],

        [[ 4,  5]]],


       [[[ 6,  7]],

        [[ 8,  9]],

        [[10, 11]]]])

In [6]: b
Out[6]:
array([[[ 0,  1],
        [ 2,  3]],

       [[ 4,  5],
        [ 6,  7]],

       [[ 8,  9],
        [10, 11]]])

In [7]: np.dot(a,b)
Out[7]:
array([[[[[  2,   3],
          [  6,   7],
          [ 10,  11]]],


        [[[  6,  11],
          [ 26,  31],
          [ 46,  51]]],


        [[[ 10,  19],
          [ 46,  55],
          [ 82,  91]]]],



       [[[[ 14,  27],
          [ 66,  79],
          [118, 131]]],


        [[[ 18,  35],
          [ 86, 103],
          [154, 171]]],


        [[[ 22,  43],
          [106, 127],
          [190, 211]]]]])

In [8]: np.dot(a,b).shape
Out[8]: (2, 3, 1, 3, 2)
计算过程:
In [9]: np.dot(np.array([[[[0,1]]]]),np.array([[[0,1],[2,3]]]))
Out[9]: array([[[[[2, 3]]]]])

In [10]: np.dot(np.array([[[[0,1]]]]),np.array([[[4,5],[6,7]]]))
Out[10]: array([[[[[6, 7]]]]])

In [11]: np.dot(np.array([[[[0,1]]]]),np.array([[[8,9],[10,11]]]))
Out[11]: array([[[[[10, 11]]]]])
  • 两向量点积:numpy.vdot(a, b)
①参数a、b都是高维数组,vdot处理多维数组和dot处理方式不同,不是执行矩阵乘积,只能执行向量点积,则需将数组先扁平化,然后再计算

In [1]: import numpy as np
   ...: a = np.array([[1, 4], [5, 6]])
   ...: b = np.array([[4, 1], [2, 2]])
   ...: np.vdot(a,b)
   ...:
Out[1]: 30
a、b数组扁平化即将多维数组转换成一维数组,可以使用ravel函数处理
In [2]: np.vdot(a.ravel(), b.ravel())
Out[2]: 30
②参数a、b为复数
In [3]: a = np.array([1+2j,3+4j])
   ...: b = np.array([5+6j,7+8j])
   ...: np.vdot(a,b)
   ...:
Out[3]: (70-8j)

In [4]: np.vdot(b,a)
Out[4]: (70+8j)
通过上述结果可知:np.vdot(a,b)和np.vdot(b,a)计算出来的结果刚好互为共轭复数关系(实部相同,虚部互为相反数),其计算结果为取vdot函数中的第一个参数的共轭复数与另外一个参数点积。
以np.vdot(a,b)计算为例:
第一步:计算a的共轭复数c=np.array([1-2j,3-4j])
第二步:计算c与b的点积
In [5]: import numpy as np
   ...: a = np.array([1+2j,3+4j])
   ...: b = np.array([5+6j,7+8j])
   ...: c = np.array([1-2j,3-4j])
   ...: d = np.array([5-6j,7-8j])
   ...: np.dot(c,b)
   ...:
Out[5]: (70-8j)

In [6]: np.dot(a,d)
Out[6]: (70+8j)
2、求解方程与求逆矩阵

  • 逆矩阵:numpy.linalg.inv(a)
In [1]: import numpy as np
   ...: from numpy.linalg import inv
   ...: a = np.array([[1., 2.], [3., 4.]])
   ...: inv(a)
   ...:
Out[1]:
array([[-2. ,  1. ],
       [ 1.5, -0.5]])
知识点:矩阵与其逆矩阵点积等于同阶单位矩阵,求解逆矩阵的方法有:待定系数法、伴随矩阵法、初等变换法
In [2]: np.dot(a,inv(a))
Out[2]:
array([[  1.00000000e+00,   1.11022302e-16],
       [  0.00000000e+00,   1.00000000e+00]])
比较两数组:numpy.allclose(a, b, rtol=1e-05, atol=1e-08, equal_nan=False)
In [3]: np.allclose(np.dot(a,inv(a)),np.eye(2))
Out[3]: True
  • 最小二乘法:numpy.linalg.lstsq(a, b, rcond=-1)
1、b为一维数组
In [13]: import numpy as np
    ...: from numpy.linalg import lstsq
    ...: X1 = np.array([[1, 6, 2], [1, 8, 1], [1, 10, 0], [1, 14, 2], [1, 18, 0
    ...: ]])
    ...: y1= np.array([[7], [9], [13], [17.5], [18]])
    ...: np.linalg.lstsq(X1, y1)
    ...:
Out[13]:
(array([[ 1.1875    ],
        [ 1.01041667],
        [ 0.39583333]]),
 array([ 8.22916667]),
 3,
 array([ 26.97402951,   2.46027806,   0.59056212]))
从上述结果可知:返回元组,元组中四个元素,第一元素表示所求的最小二乘解,第二个元素表示残差总和,第三个元素表示X1矩阵秩,第四个元素表示X1的奇异值
2、b为多维数组
In [14]: import numpy as np
    ...: from numpy.linalg import lstsq
    ...: X1 = np.array([[1, 6, 2], [1, 8, 1], [1, 10, 0], [1, 14, 2], [1, 18, 0
    ...: ]])
    ...: y1= np.array([[7,8], [9,7], [13,10], [17.5,16], [18,17]])
    ...: np.linalg.lstsq(X1, y1)
    ...:
Out[14]:
(array([[ 1.1875    , -1.125     ],
        [ 1.01041667,  1.02083333],
        [ 0.39583333,  1.29166667]]),
 array([ 8.22916667,  2.91666667]),
 3,
 array([ 26.97402951,   2.46027806,   0.59056212]))
通过上面两个结果对比分析:参数b维度增加,第一个、第二个元素数组维度也变化,其对应的第K列分别表示对b数组中第k列的最小二乘法求解、残差总和












<think> 我们被要求提供关于numpy.linalg.norm的使用方法。根据引用[2][4][5],我们知道numpy.linalg.norm用于计算向量或矩阵的范数。我们将详细说明该函数的参数和使用方法。 函数签名: numpy.linalg.norm(x, ord=None, axis=None, keepdims=False) 参数解释: - x:输入数组,可以是向量或矩阵。 - ord:范数的阶数。不同的ord值对应不同的范数计算方式。如果不指定,默认是2范数(对于向量)或Frobenius范数(对于矩阵)。 - axis:指定沿哪个轴计算范数。如果为None(默认值),则会将数组展平后计算范数;如果为整数,则沿该轴计算向量范数;如果为二元组(针对矩阵),则计算矩阵范数。 - keepdims:bool类型,是否保持原数组的维度。如果为True,则被计算范数的轴将保留为1的维度(而不是被压缩掉)。 常用范数类型: 1. 向量范数: - ord=2(默认):L2范数(欧几里得范数),即向量元素的平方和再开方:$\|x\|_2 = \sqrt{\sum_i |x_i|^2}$ - ord=1:L1范数,即向量元素的绝对值之和:$\|x\|_1 = \sum_i |x_i|$ - ord=np.inf:无穷范数,即向量元素绝对值的最大值:$\|x\|_\infty = \max(|x_i|)$ - ord=-np.inf:负无穷范数,即向量元素绝对值的最小值:$\|x\|_{-\infty} = \min(|x_i|)$ - ord=0(非正式):非零元素个数(注意:严格数学定义中0范数不是非零元素个数,但在一些库中这样使用) - 其他整数或浮点数:对应阶数的范数。 2. 矩阵范数: - ord='fro':Frobenius范数(默认情况之一),即矩阵元素的平方和再开方。 - ord=2:矩阵的2-范数(谱范数),即最大奇异值。 - ord=1:矩阵的1-范数,即各列元素绝对值之和的最大值。 - ord=np.inf:矩阵的无穷范数,即各行元素绝对值之和的最大值。 - ord='nuc':核范数,即奇异值之和。 使用示例: 1. 计算向量的L2范数: ```python import numpy as np x = np.array([3, 4]) norm_val = np.linalg.norm(x) # 默认ord=2 print(norm_val) # 输出: 5.0 (因为 sqrt(3^2+4^2)=5) ``` 2. 计算向量的L1范数: ```python x = np.array([1, -1, 2]) norm_val = np.linalg.norm(x, ord=1) print(norm_val) # 输出: 4.0 (因为 |1|+|-1|+|2|=4) ``` 3. 计算矩阵的Frobenius范数: ```python A = np.array([[1, 2], [3, 4]]) norm_val = np.linalg.norm(A, ord='fro') print(norm_val) # 输出: 5.477225575051661 (因为 sqrt(1^2+2^2+3^2+4^2)=sqrt(30)) ``` 4. 计算矩阵的每一行的L2范数(并归一化): 根据引用[4]: ```python W = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 计算每行的L2范数,保持维度(keepdims=True)以便进行广播 row_norms = np.linalg.norm(W, ord=2, axis=1, keepdims=True) W_normalized = W / row_norms print(W_normalized) ``` 5. 计算矩阵的谱范数(2-范数): ```python A = np.array([[1, 2], [3, 4]]) norm_val = np.linalg.norm(A, ord=2) print(norm_val) # 输出: 5.464985704219043 (最大奇异值) ``` 注意事项: - 当数组是复数时,范数计算会使用模。 - 使用axis参数可以指定计算的方向。例如,对于矩阵,axis=0表示计算每列的范数,axis=1表示计算每行的范数。 总结:numpy.linalg.norm是一个功能强大的函数,可以计算多种向量和矩阵范数。通过合理设置ord、axis和keepdims参数,可以灵活地进行范数计算。 §§相关问题§§ 1. 如何在NumPy中计算矩阵的核范数(nuclear norm)? 2. numpy.linalg.norm在计算复数数组时的行为是什么? 3. 如何使用numpy.linalg.norm进行归一化操作? 4. 矩阵的Frobenius范数和谱范数有什么区别? </think> ### `numpy.linalg.norm` 使用指南 `numpy.linalg.norm` 是 NumPy 线性代数模块中用于计算**向量或矩阵范数**的核心函数。以下是详细的使用方法和参数解析: --- #### **函数签名** ```python numpy.linalg.norm(x, ord=None, axis=None, keepdims=False) ``` #### **参数说明** | 参数 | 类型 | 说明 | |-----------|---------------|----------------------------------------------------------------------| | `x` | array_like | 输入数组(向量或矩阵) | | `ord` | {int, float, str} | 范数类型(默认为 $L_2$ 范数),支持标量值或特定字符串(如 `'fro'`) | | `axis` | {int, tuple} | 计算轴方向(针对多维数组) | | `keepdims`| bool | 是否保留原数组维度(默认为 `False`) | --- #### **常用范数类型与 `ord` 取值** 1. **向量范数**: - `ord=2`(默认):$L_2$ 范数(欧几里得范数)$\|x\|_2 = \sqrt{\sum |x_i|^2}$ - `ord=1`:$L_1$ 范数 $\|x\|_1 = \sum |x_i|$ - `ord=np.inf`:无穷范数 $\|x\|_\infty = \max(|x_i|)$ - `ord=0`:非零元素数量(伪范数) 2. **矩阵范数**: - `ord='fro'`:Frobenius 范数 $\|A\|_F = \sqrt{\sum |a_{ij}|^2}$ - `ord=2`:谱范数(最大奇异值) - `ord=1`:列和最大值 $\max_j(\sum_i |a_{ij}|)$ - `ord=np.inf`:行和最大值 $\max_i(\sum_j |a_{ij}|)$ --- #### **示例代码** 1. **计算向量的 $L_2$ 范数** ```python import numpy as np x = np.array([3, 4]) norm_val = np.linalg.norm(x) # ord=2 为默认值 print(norm_val) # 输出: 5.0 (因为 $\sqrt{3^2 + 4^2}=5$) ``` 2. **计算矩阵的 Frobenius 范数** ```python A = np.array([[1, 2], [3, 4]]) fro_norm = np.linalg.norm(A, ord='fro') print(fro_norm) # 输出: 5.477 (因为 $\sqrt{1^2+2^2+3^2+4^2} \approx 5.477$) ``` 3. **按轴计算范数(如矩阵每行的 $L_2$ 范数)**[^4] ```python W = np.array([[1, 2, 3], [4, 5, 6]]) # 计算每行的 L2 范数,keepdims=True 保持二维结构 row_norms = np.linalg.norm(W, ord=2, axis=1, keepdims=True) print(row_norms) # 输出: [[3.741] [8.775]] ``` 4. **归一化矩阵每行** ```python W_normalized = W / row_norms # 广播除法 print(W_normalized) # 输出: [[0.267, 0.534, 0.801], [0.456, 0.570, 0.684]] ``` --- #### **注意事项** 1. 当 `axis=None` 时,函数会将数组展平后计算范数。 2. 复数数组的范数基于模计算:$\|z\| = \sqrt{\sum |z_i|^2}$。 3. 高阶张量可通过 `axis` 指定多个轴(如 `axis=(0,1)`)。 4. 与 `scipy.linalg.norm` 的区别:NumPy 版本专注于基础范数,SciPy 提供更多高级选项(如核范数)[^3]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值