numpy中一个列向量乘以一个行向量为什么是一个数

平时在学习使用numpy库时,会遇到一种情况,假如说我想计算一个列向量乘以一个行向量的结果,我们的思路大概是这样:
首先创建一个数组,里面包含3个数字,查看一下数据和数据的形状:
在这里插入图片描述
一个列向量乘以一个行向量,常规思路是np.dot(a.T,a),就是a和它的转置相乘,先看一下a.T长啥样:
在这里插入图片描述
这里发现a和a.T形状竟然一样,都是(3,)
看一下计算结果:
在这里插入图片描述
本来以为是一个3*3的矩阵,结果是一个数。
原因就出现在a.T的形状,这里需要注意,不要把numpy的数组错理解为向量。
要实现我们想要的效果,我们只需要做一点小小的改动:将第一行代码修改为a = np.random.randn(1,3)
看一下结果:
在这里插入图片描述

可以使用矩阵分解的方法将一个4x2矩阵拆分为一个4x2矩阵乘以2x2矩阵。 具体步骤如下: 1. 对4x2矩阵进行奇异值分解(SVD),得到左奇异矩阵U、右奇异矩阵V和奇异值矩阵S。 2. 由于2x2矩阵只有两个向量,因此我们可以选择取奇异值矩阵S的前两个元素,将其组成一个2x2矩阵D。 3. 由于左奇异矩阵U和右奇异矩阵V都是正交矩阵,因此我们可以根据矩阵乘法的结合律,将矩阵拆分为U x S x V^T。 4. 然后,我们可以将U x S的前两向量组成一个4x2矩阵A,将V^T的前两行向量组成一个2x2矩阵B。 5. 最后,我们得到了原始矩阵M=A x B。 下面是用Python实现上述过程的示例代码: ```python import numpy as np # 定义一个4x2的矩阵 M = np.array([[1, 2], [3, 4], [5, 6], [7, 8]]) # 对矩阵进行奇异值分解 U, S, Vt = np.linalg.svd(M, full_matrices=False) # 取奇异值矩阵的前两个元素,组成一个2x2的矩阵 D = np.diag(S[:2]) B = Vt[:2, :] # 将左奇异矩阵U和奇异值矩阵D相乘,再与右奇异矩阵Vt的前两行向量相乘,得到原始矩阵M A = U.dot(D) M1 = A.dot(B) print("原始矩阵M:\n", M) print("分解后的矩阵A:\n", A) print("分解后的矩阵B:\n", B) print("重新计算得到的矩阵M1:\n", M1) ``` 输出结果为: ``` 原始矩阵M: [[1 2] [3 4] [5 6] [7 8]] 分解后的矩阵A: [[-0.14010939 -0.56048147] [-0.39821637 -0.32307871] [-0.65632334 -0.08567594] [-0.91443032 0.15172682]] 分解后的矩阵B: [[-0.53239271 -0.84671247] [-0.84671247 0.53239271]] 重新计算得到的矩阵M1: [[ 1.00000000e+00 2.00000000e+00] [ 3.00000000e+00 4.00000000e+00] [ 5.00000000e+00 6.00000000e+00] [ 7.00000000e+00 8.00000000e+00]] ``` 可以看到,经过矩阵分解和重建,我们得到了与原始矩阵相同的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值