python中矩阵与数组相乘的问题(转载)

转载自 https://blog.csdn.net/weixin_43069755/article/details/88209967

下文探究一下在神经网络中可能会遇到的np.dot(数组,矩阵)和np.dot(矩阵,数组)等矩阵与数组相乘的问题:

(1) np.dot(数组,矩阵):

import numpy as np
import tensorflow as tf
A = np.array([6,7,8])
B = np.array([[1,2], [3, 4], [5,6]])
print(A.shape)
print(B.shape)
print(np.dot(A,B).shape)
print(np.dot(A,B))

结果:

(3,)
(3, 2)
(2,)
[67 88]

小结:A为3个元素的数组((2,)表示类型为数组(注意不是矩阵!),且元素个数为2),B为3x2矩阵,np.dot(A,B)得到的为一个元素个数为2的数组。

(2) np.dot(矩阵,数组):

import numpy as np
import tensorflow as tf
B = np.array([[1,2], [3, 4], [5,6]])
C = np.array([7,8])
print(B.shape,C.shape)
print(np.dot(B,C).shape)
print(np.dot(B,C))

结果:

(3, 2) (2,)
(3,)
[23 53 83]

小结:B为3x2矩阵,C为3个元素的数组,np.dot(B,C)得到的为一个元素个数为3的数组。

结论:

  • 在python中,矩阵与数组采用np.dot()计算时,所得结果均为一个数组;
  • 数组在前时,可按照将数组看成1行n列的矩阵,与矩阵相乘,可得计算结果。但需注意计算结果依然只是数组,及其shape为(k,)形式,而不是(1,k);
  • 数组在后时,将矩阵的行与数组分别进行数量积相乘,所得结果组成的向量即为所得结果。即1x7+2x8=23,3x7+4x8=53, 5x7+6x8=83,组成数组[23,53,83]。
  • [23,53,83]是一个数组,它的shape为(3,)
  • [ [23,53,83] ]是一个矩阵,它的shape是(1,3)
  • 只有[ [23],[53],[83] ]才是一个列向量

在python中,数组和矩阵相乘与我们在线型代数中将向量看成一个列向量的思路是非常不同的,在python中数组的储存是按行存储的(在C语言,matlab中也是按行存储)。 根据吴恩达老师的建议,他在搭建神经网络时,一般不用数组,而是把数组通过reshape()函数转化为矩阵,以减少出错的可能性。

以上代码,建议大家自己运行一遍,仔细体会。
(转载请注明出处)

posted @ 2020-08-21 16:04  tangq123  阅读(2963)  评论(0编辑  收藏  举报