numpy中数组的乘法

做神经网络运算时,发现numpy中的乘法运算和Octave有些不同,这里专门进行了学习和比较说明。
需要强调的是,这里的运算都是针对数组(Array),而不是矩阵(Matrix)。

axis

先简单介绍下axis,因为有些函数会用到该类型的参数。对于shape为(m,n)的数组,axis=0指的是m那个维度,axis=1指的是n那个维度。如果有更高维的话,以此类推。可以通过[]和中间出现的,来确认axis。以sum操作为例:

>>> a = np.arange(12).reshape(3,2,2)
>>> a
array([[[ 0,  1],
        [ 2,  3]],
       [[ 4,  5],
        [ 6,  7]],
       [[ 8,  9],
        [10, 11]]])
>>> a.sum(axis=0) //按0轴合并,结果是2x2
array([[12, 15],
       [18, 21]])
>>> a.sum(axis=2) //结果是3x2
array([[ 1,  5],
       [ 9, 13],
       [17, 21]])
>>> a.sum(axis=1) //结果是3x2
array([[ 2,  4],
       [10, 12],
       [18, 20]])

假设拥有一组数组,代表班内10个学生,对3门课程的喜爱程度(0-10记分),那么可以通过axis快速的计算每门学科受欢迎的程度。

np.dot()

数组的点积: * 对于二位数组等同于矩阵相乘 * 对于一维数组做向量点积 * 对于其他情况,是a最后一维和b倒数第二维的乘积,”a sum product over the last axis of a and the second-to-last of b”

对于第三种情形

np.multipy()

两个数组中,对应位置的元素相乘,等同于*。”Multiply arguments element-wise.”

broadcasting

广播是numpy中很重要的概念,Andrew在课程中提及了很多次。广播定义的是在numpy中,不同shape的数组,是如何进行计算(其实主要是返回结果维度的计算)。具体步骤是操作的数组从最后一个维度对齐,然后向前扩展——顾名思义为广播。广播结果的维度取决于输入:

  1. 如果其中任一维度为1,那么结果是两个维度的积
  2. 两个维度相同,那结果也是相同的维度

例如:

A      (3d array):  15 x 3 x 5
B      (3d array):  15 x 1 x 5
Result (3d array):  15 x 3 x 5

而如下面的数组,是不能进行广播的,因为不符合条件1或2。

A      (1d array):  3
B      (1d array):  4 # trailing dimensions do not match

回到我遇到的问题,两个ndarray 类型的对象,shape分别为 1x33x4。当我使用 * 来计算乘积的时候,运行报错。现在应该明白,* 运算是对应元素相乘。对于维度不同的数组,此时会尝试广播;又因为最后的维度不满足条件1或2,故而出错。

Comments