主要为将来的张量(Tensor)计算打基础
NumPy 包包含numpy.linalg模块,提供线性代数所需的所有功能,主要功能有下
dot 两个数组的点积
vdot 两个向量的点积
inner 两个数组的内积
matmul 两个数组的矩阵积
1 点积 numpy.dot()
对于一维数组(向量),相当于内积;对于二维数组(矩阵),相当于矩阵乘法;对于多维数组(张量),它是a的最后一个轴上的和与b的倒数第二个轴的乘积。
import numpy as np
a = np.array([[[1,2],[3,4]],[[5,6],[7,8]]])
b = np.array([[[2,4],[3,6]],[[4,8],[5,10]]])
c = np.dot(a,b)
print(a)
print(b)
print()
print(c)
# 输出
[[[1 2]
[3 4]]
[[5 6]
[7 8]]]
[[[ 2 4]
[ 3 6]]
[[ 4 8]
[ 5 10]]]
[[[[ 8 16]
[ 14 28]]
[[ 18 36]
[ 32 64]]]
[[[ 28 56]
[ 50 100]]
[[ 38 76]
[ 68 136]]]]
对于二阶以下的都很好理解,这里画图举例一个(2,2,2)与(2,2,2)的np.dot的结果:
2 向量点积 vdot()
import numpy as np
a = np.array([[1,2],[3,4]])
b = np.array([[11,12],[13,14]])
print np.vdot(a,b)
#输出
130
EZ
3 内积 numpy.inner()
对于一维数组,返回向量内积
对于高维数组,先将高维数组分成多个一维数组,再依次做向量内积:
import numpy as np
a = np.array([[1,2], [3,4]])
b = np.array([[11, 12], [13, 14]])
c = np.inner(a,b)
print (a)
print(b)
print(c)
#输出
[[1 2]
[3 4]]
[[11 12]
[13 14]]
[[35 41]
[81 95]]
#计算过程如下
1*11+2*12, 1*13+2*14
3*11+4*12, 3*13+4*14
4 矩阵乘积 numpy.matmul()
numpy.matmul()函数返回两个数组的矩阵乘积。 虽然它返回二维数组的正常乘积,但如果任一参数的维数大于2,则将其视为存在于最后两个索引的矩阵的栈,并进行相应广播。
另一方面,如果任一参数是一维数组,则通过在其维度上附加 1 来将其提升为矩阵,并在乘法之后被去除。
发现与inner()结果是一样的…
#一个是一维的数组
import numpy as np
a = np.array([[1,2], [3,4]])
b = np.array([11, 12])
c = np.inner(a,b)
print(a)
print(b)
print()
print(c)
#输出
[[1 2]
[3 4]]
[11 12]
[35 81]
#一个是多维数组
import numpy as np
a = np.arange(8).reshape(2,2,2)
b = np.arange(4).reshape(2,2)
c = np.matmul(a,b)
print(a)
print()
print(b)
print()
print(c)
#输出
[[[0 1]
[2 3]]
[[4 5]
[6 7]]]
[[0 1]
[2 3]]
[[[ 2 3]
[ 6 11]]
[[10 19]
[14 27]]]
#计算过程是将a分成两个矩阵,依次与第二个矩阵相乘:
[[[0 1] * [[0 1]
[2 3]] [2 3]],
[[4 5] * [[0 1]
[6 7]] [2 3]]]
参考:
https://blog.csdn.net/wc781708249/article/details/78194039?locationNum=10&fps=1
https://www.yiibai.com/numpy/numpy_linear_algebra.html