python中numpy各种乘法区别(*, dot, multiply, einsum)

import numpy as np

1. 星号(*)

1.1 函数作用

数组相同位置求积,

矩阵执行标准的矩阵计算。

1.2 函数说明

数组(两个矩阵的大小必须一致):

A = np.arange(0,4).reshape(2,2)
A
array([[0, 1],
       [2, 3]])
B = np.arange(5,9).reshape(2,2)
B
array([[5, 6],
       [7, 8]])
A * B
array([[ 0,  6],
       [14, 24]])

# 说明
[[0*5, 1*6],
[2*7, 3*8]]

矩阵(矩阵大小满足乘法规则即可 [m,n] * [n,p]):

A_mat = np.mat(A)
A_mat
matrix([[0, 1],
        [2, 3]])
B_mat = np.mat(B)
B_mat
matrix([[5, 6],
        [7, 8]])
A_mat * B_mat
matrix([[ 7,  8],
        [31, 36]])

# 说明
[[0*5+1*7, 0*6+1*8],
[2*5+3*7, 2*6+3*8]]

2. dot() 函数

2.1 函数作用

数组 1维 对应位置相乘再累加

        2维 标准的矩阵乘法

        大于2维 可以自己尝试

矩阵 标准的矩阵计算

2.2 函数说明

数组

# 1 维
A = np.arange(0,3).reshape(3)
A
>>> array([0, 1, 2])
A.shape
>>> (3,)

B = np.arange(3,6).reshape(3)、
B
>>> array([3, 4, 5])
B.shape
>>> (3,)

np.dot(A,B)
>>> 14 (0*3 + 1*4 + 2*5)
# 2维(数组大小满足矩阵乘法规律)

A = np.arange(0,4).reshape(2,2)
B = np.arange(4,8).reshape(2,2)
np.dot(A,B)

>>> array([[ 6,  7],
       [26, 31]])
# 3维
A = np.arange(0,8).reshape(2,2,2)
A
>>> array([[[0, 1],
        [2, 3]],

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

B = np.arange(8,16).reshape(2,2,2)
B
>>> array([[[ 8,  9],
        [10, 11]],

       [[12, 13],
        [14, 15]]])

np.dot(A,B)
>>> array([[[[ 10,  11],
         [ 14,  15]],

        [[ 46,  51],
         [ 66,  71]]],


       [[[ 82,  91],
         [118, 127]],

        [[118, 131],
         [170, 183]]]])

矩阵:标准的矩阵乘法操作。

3. multiply() 函数

3.1 函数作用

数组和矩阵都是对应位置相乘,两个相乘的元素的大小必须相同,返回结果的大小和原来结果大小一致。

3.2 函数说明

数组

A = np.arange(0,9).reshape(3,3)
B = np.arange(0,9).reshape(3,3)

np.multiply(A,B)

>>> array([[ 0,  1,  4],
       [ 9, 16, 25],
       [36, 49, 64]])

矩阵

np.multiply(np_mat(A), np_mat(B))
 
>>> matrix([[ 0,  1,  4],
        [ 9, 16, 25],
        [36, 49, 64]])

4.einsum() 强大的可自定义的矩阵乘法计算

4.1 函数作用

数组:

可实现数组内元素求和,数组点积,内积(矩阵点乘),外积(矩阵叉乘)。

矩阵:

可实现单个矩阵的内部计算结果(元素求和、按行列求和、对角线元素操作等),

以及自定义两个矩阵的乘法。

4.2 函数说明

数组

A = np.arange(0,3)
A

>>> array([0, 1, 2])

B = np.arange(3,6)
B

>>> array([3, 4, 5])


# 数组内元素累加求和
np.einsum('i->',A)

>>> 3

# 数组点乘
np.einsum('i,i->i',A,B)

>>> array([ 0,  4, 10])

# 数组内积
np.einsum('i,i',A,B)

>>> 14

# 数组外积
np.einsum('i,j->ij',A,B)

>>> array([[ 0,  0,  0],
       [ 3,  4,  5],
       [ 6,  8, 10]])

矩阵

A = np.mat(np.arange(0,4).reshape(2,2))
B = np.mat(np.arange(4,8).reshape(2,2))
A
>>> matrix([[0, 1],
            [2, 3]])
B
>>> matrix([[4, 5],
            [6, 7]])

##########################
# 单个矩阵内部操作
##########################

# 所有元素
np.einsum('ij',A)
>>> array([[0, 1],
       [2, 3]])

# 所有元素求和
np.einsum('ij->',A)
>>> 6

# 所有主对角线元素
np.einsum('ii->i',A)
>>> array([0, 3])

# 所有主对角线元素求和
np.einsum('ii->',A)
>>> 3

# 返回按行列求和
np.einsum('ij->i',A)
>>> array([1, 5])
np.einsum('ij->j',A)
>>> array([2, 4])

##########################
# 两个矩阵相乘
##########################

# 点乘
np.einsum('ij,ij->ij',A, B)
>>> array([[ 0,  5],
       [12, 21]])

# 外积
np.einsum('ij,jk->ik',A, B)
>>> array([[ 6,  7],
       [26, 31]])

# 内积
np.einsum('ij,ij',A, B)
>>> 38




  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值