积跬步至千里 || python 中的向量格式与运算

python 中的向量格式与运算


python 中的向量有两种形式, 一种是矩阵形式的向量; 另一种是普通的向量. 这两种形式的向量虽然看似相同, 但是在存储、赋值或者运算时都有着本质的区别.

import numpy as np

x = np.array([1,2,3,4])
y = np.array([[1,2,3,4]])
print('普通向量{}的形状为:{}\n'.format(x,x.shape))
print('普通向量{}的形状为:{}\n'.format(y,y.shape))

'''
普通向量[1 2 3 4]的形状为:(4,)

普通向量[[1 2 3 4]]的形状为:(1, 4)
'''

1. 矩阵中的向量

python 中的向量和矩阵中的向量有所不同. 矩阵中的向量分为行向量或列向量, 以矩阵形式进行存储, 其格式为 A n × 1 A_{n\times 1} An×1 B 1 × n B_{1\times n} B1×n. 由于矩阵格式的向量可以参与矩阵乘法运算, 但是无法给矩阵单个列进行赋值. (对单个行是可以整体赋值).

import numpy as np
y = np.array([[1,2,3,4]])
One = np.ones((4,4))
c = One@y.T
print('A*y.T的结果为:\n{}\n\n A*y.T的形状为:{}\n'.format(c,c.shape))
'''
A*y.T的结果为:
[[10.]
 [10.]
 [10.]
 [10.]]

 A*y.T的形状为:(4, 1)
'''

One[1,:]=y
print('矩阵第2行被替代后的结果为:\n{}\n'.format(One))
'''
矩阵第2行被替代后的结果为:
[[1. 1. 1. 1.]
 [1. 2. 3. 4.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]]
'''
One[:,2]=y.T # 矩阵进行列替代的时候出现了报错, 修改为 y.reshape(-1,)报错消失
print(One)
print('普通向量{}的形状为:{}\n'.format(y,y.shape))

'''
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Input In [25], in <cell line: 8>()
      6 One[1,:]=y
      7 print('矩阵第2行被替代后的结果为:\n{}\n'.format(One))
----> 8 One[:,2]=y.T # 矩阵进行列替代的时候出现了报错, 修改为 y.reshape(-1,)报错消失
      9 print(One)
     10 print('普通向量{}的形状为:{}\n'.format(y,y.shape))

ValueError: could not broadcast input array from shape (4,1) into shape (4,)
'''

解决此问题达到利用矩阵的列替换原有矩阵列效果的做法可以将列索引设置成列表

import numpy as np
y = np.array([[1,2,3,4]])
One = np.ones((4,4))
Zero = np.zeros((4,1))
One[:,[1]]=Zero # 将列标号设置成列表的形式
print(One)

2. 利用普通向量对矩阵进行填补

python 中的普通向量没有行向量或者列向量之分, 其形状均为 ( n , ) (n,) (n,). 这种格式无法参与矩阵的乘法, 需要利用 reshape(-1,1) 先转化成矩阵型向量. 其最大的优势就是可以直接赋值到矩阵特定的列.

import numpy as np
x = np.array([1,2,3,4])
One = np.ones((4,4))
print('向量 x 的形状为: {}\n'.format(x.shape))

One[:,2]=x.T # 矩阵进行列替代的时候出现了报错, 修改为 y.reshape(-1,)报错消失
print('替换后的矩阵为:\n {}'.format(One))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值