最近因为学习python的需要,看了一些关于numpy(python的一个科学计算库)的基本知识(想学习numpy的可以浏览这篇博文深度学习与计算机视觉系列(1)_基础介绍,有助于你快速了解numpy基础语法),但看到numpy中array的乘法运算时,由于array的乘法符号表示与常见的线性代数中矩阵运算符号恰好相反,脑子总是绕不过弯。为了更好的记忆和使用array的乘法符号,现记录一下自己在查阅资料后关于numpy中array乘法运算符号的理解。
numpy的基本数据类型是array(数组),即一些类型相同的元素组成的类矩阵数据,用list或者嵌套的list可以初始化。它既有一维的(通过list初始化),也有多维的(通过嵌套的list初始化,有几层嵌套就是几维),例子见下:
import numpy as np
#一维Numpy数组
x=np.array([1,2,3])
#多维Numpy数组
x2=np.array([[1,2,3],[4,5,6]]) #x2.ndim=2,x2.shape=(2,3)
x3=np.array([[[1,2],[1,2]],[[3,4],[3,4]],[[5,6],[5,6]]]) #x3.ndim=3,x3.shape=(3,2,2)
此外,numpy也有矩阵数据类型matrix,是array的一个子类,这个类型跟线性代数中的矩阵含义一致,执行的是通常意义上的矩阵运算,不过官方文档建议使用array,因为array有更多的支持,进行元素乘法时也更方便。array和matrix两种类型的具体区别以及numpy和matlab的区别可以阅读这里。
Numpy数组用x*y
或np.multiply(x,y)
表示基于元素的乘法,即两个array对应的元素相乘得到一个同种shape的array;用x.dot(y)
或np.dot(x,y)
表示向量内积或矩阵乘法。具体例子见下:
import numpy as np
x = np.array([[1,2],[3,4]])
y = np.array([[5,6],[7,8]])
# 元素对元素,点对点的乘积
# [[ 5 12]
# [21 32]]
print x * y
print np.multiply(x, y)
v = np.array([9,10])
w = np.array([11, 12])
# 向量内积,得到 219
print v.dot(w)
print np.dot(v, w)
# 矩阵乘法(一维array既可以看作是行向量也可以看作是列向量,看它放的位置依据矩阵乘法规则可判断)
# v放在后面,做列向量,得到 [29 67]
print x.dot(v)
print np.dot(x, v)
# v放在前面,做行向量,得到 [39 58]
print v.dot(x)
print np.dot(v,x)
# 矩阵乘法
# [[19 22]
# [43 50]]
print x.dot(y)
print np.dot(x, y)