首先介绍一下叉乘和点乘的区别,在线性代数中我们学习过矩阵的乘法,这里所说的乘法一般默认是叉乘(也叫内积),而点乘则指的是矩阵对应元素的相乘。
我们可以把矩阵看成数组的一种,也就是为维度是二维的介绍,接下来我们讲解一下numpy数组和他的叉乘、点乘操作:
使用numpy创建的数组叫做ndarray,是一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组。接下来我们来创建几个数组:
1、一维数组
2、二维数组
##两行一列b = np.array([[1], [1]])##两行两列d = np.array([[1, 2], [1, 2]])3、三维数组
##形状为1X2X2e = np.array([[[1, 2], [1, 2]]])##形状为1X3X2f = np.array([[[1, 2], [1, 2], [1, 2]]])在此举这么多重复的例子主要是为了帮助大家理解数组维度的对应关系,也方便我们通过索引来寻找指定的元素。例如,f[0, 1, 1] = 2
二、数组的内积一般涉及二维数组,二维数组的叉乘需要满足一个条件,那就是第一个数组的列数要和第二个数组的行数相等,具体的数学计算方法大家可以上网搜一下。在python里进行这个操作我们一般使用np.dot()。
##矩阵的乘法,前一个矩阵的列数等于下一个矩阵的行数,生成的矩阵行数和第一个的相同,列数和第二个的相同m = np.array([[1, 2, 3], [4, 5, 6]]) ##2X3n = np.array([[1, 2], [3, 4], [5, 6]]) ##3X2p = np.dot(m, n)q = np.matmul(m, n)##p和q相同 三、数组的点乘使用np.multiply函数或者乘号(*)
a = np.zeros((2,2,2))a[:,:,0]=([[3,6],[5,8]])a[:,:,1]=([[2,5],[7,2]])b = np.zeros((2,2,2))b[:,:,0]=([[3,2],[9,6]])b[:,:,1]=([[7,8],[1,0]])c = a*bd = np.multiply(a, b)print(np.all(c == d))##输出为True看到这里,大家可能觉得进行点乘操作的两个矩阵的形状要相同,但是事实上做点乘的两个矩阵的形状不一定要相同。
x = np.array([[1], [2]]) #2X1y = np.array([[[1, 1], [2, 4]]]) #1X2X2z = x * y #1X2X2最后,如果我们想把数组的每个元素进行平方,可以进行如下两种操作:
e = np.array([1, 2, 3, 4, 5, 6])f = e ** 2g = e * eprint(np.all(f == g))##输出为True