Python numpy中的一维数组和矩阵之间的点乘和矩阵乘法计算

在numpy中,一维数组是一个很奇葩的存在,在数组与矩阵计算时,很容易产生混淆,到底数组在矩阵计算时是应当作为行向量还是列向量呢?

经过测试,本文预先给出如下结论:

1.数组点乘矩阵时,将数组看做是行向量,按行依次与矩阵最内层方括号的内容(最后一个维度)点乘。
2.数组左乘矩阵时,将数组作为行向量,结果的维度数减1。
3.数组右乘矩阵时将数组作为列向量,结果的维度数减1。
4.注意: 上述计算中的数组和矩阵需分别对应点乘和矩阵乘法的数据长度规则,遇到长度不同时,将报错

 

1.数组与数组和数组与矩阵之间的点乘

1.1数组与数组之间的点乘

数组之间维度相同时,可以任意进行点乘和点除计算,其他的计算如,sqrt、power、log等运算都是对每个元素进行计算的,此时,完全可以将数组看作是二维行向量。相关的结果与二维行向量的结果是一致的。

# _*_coding: UTF-8_*_
# 开发作者 :TXH
# 开发时间 :2020-09-30 11:58
# 文件名称 :数组乘除.py
# 开发工具 :Python 3.7 + Pycharm IDE
import numpy as np

# 数组点乘点除,最后一个维度相同可以计算

a=np.array([1,2,3,4])
b=np.array([2,4,6,8])
print('#'*30)
print('a=',a,'维度为:',a.shape,'\nb=',b,'维度为:',b.shape,'\na.*b=',a*b,'\na./b=',a/b)
print('矩阵乘法结果为:',a.dot(b))
print('#'*30,'\n')

>>>
##############################
a= [1 2 3 4] 维度为: (4,) 
b= [2 4 6 8] 维度为: (4,) 
a.*b= [ 2  8 18 32] 
a./b= [0.5 0.5 0.5 0.5]
矩阵乘法结果为: 60
############################## 

1.2数组与矩阵的点乘

数组与矩阵之间的点乘,要求数组的长度和矩阵最后一个维度的长度的相同,例如数组形状为(3,),则需要对应的矩阵形状为(3,)、(a,3)、(a,b,3)才能进行点乘计算。特殊情况:(n,)数组和(n,1)阶矩阵计算得到(n,n)阶矩阵。

# 数组与矩阵的乘除法
'''
数组与矩阵的最后一个维度长度相同
'''
a=np.array([1,2]) # 维度为(2,)
b=np.array([[2],[6]]) # 维度为(2,1)
b2=np.array([[2,2],[6,3]])  # 维度为(2,2)
b3=np.array([[2,2],[6,3],[1,1]])  # 维度为(3,2)
b4=np.array([[2,2,1],[6,3,1]])  # 维度为(2,3)

# 数组对矩阵每一行按行求点乘,得到
print(a*b) # (2,)*(2,1)=(2,2) # 按行求点乘
print(a*b2) # (2,)*(2,2)=(2,2) # 按行求点乘
print(a*b3) # (2,)*(3,2)=(3,2) # 按行求点乘
# print(b4*a) # (2,)*(2,3)=() 报错


 

2.数组与矩阵相乘

在进行np.dot() 矩阵乘法时,若数组左乘矩阵:则可将其作为行矢量。若数组右乘矩阵,则可将数组作为列矢量。相应的矩阵在右时,其最后一个维度的长度必须与数组长度一致,矩阵在乘法左侧时,其第一个维度必须与矩阵的长度一致。


print(a.dot(b)) # (2,)*(2,1)=(1,) # 按列求内积,结果为数组
# print(a.dot(b.T)) # (2,)*(1,2)=(1,) # 报错
print(a.dot(b2)) # (2,)*(2,2)=(2,) # 按列求内积,结果为数组
print(b3.dot(a)) # (3,2)*(2,)=(3,) # 按行求内积,结果为数组
print(a.dot(b4)) # (2,)*(2,3)=(3,) # 按列求内积,结果为数组

# 三维验证
a=np.array([[[1,1,1],
             [2,2,2]],
            [[3,3,3],
             [4,4,4]],
            [[5,5,5],
             [6,6,6]],
            ]) #(2,3,3)
b=np.array([1,1,1]) #(3,)
print(a*b) # 将三维矩阵看做是(2,3)阶矩阵,每个元素为(3,)矩阵。每个元素与b计算点乘后放回结果,最后得到(2,3,3)阶矩阵
print(a.dot(b)) # 将三维矩阵看做是(2,3)阶矩阵,每个元素为(3,)矩阵。每个元素与b计算内积后放回结果,最后得到(2,3)阶矩阵
# print(b.dot(a)) # 报错

3.小结

      从上述实例来看,数组在进行矩阵乘法时计算结果与二维矢量的计算时相同的,只是数组计算完后会少一个维度(其实也就是数据少了一层方括号而已)。数组与矩阵的点乘需要注意(n,)数组和(n,1)阶矩阵点乘的特殊情况,其他情况下直接看做按行点乘即可。

  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

txh3093

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值