Np数组矢量和数组的点积

时间:2017-04-05 13:40:39

标签: python numpy numpy-broadcasting

我在理解numpy dot功能和广播背后的工作时遇到了问题.Below是我试图理解的片段

a=np.array([[1,2],[3,5]])

如果我们检查一下的形状 a.shape 它将是(2,2)

b=np.array([3,6])b.shape is (2,)

问题1:是b列向量还是行向量?在提供输入的同时,似乎b是行向量,但是形状将其显示为具有2行的列向量。我理解的错误是什么?

现在如果可以的话 a.dot(b) 它导致了 array([15,39])

问题2:根据矩阵乘法,如果am*n,则b必须为n*k,且a为2 * 2,然后{{1}必须是2 * 1。这是否验证b是列向量,否则如果它是行向量则矩阵乘法不可能,但点积的输出确实根据矩阵乘法给出值b作为列向量并广播它

现在b也是可能的,并且会产生结果 b.dot(a),并 这引起了我的注意。他们如何检查向量的矩阵乘法的兼容性以及它们如何计算? 在至少一个场景中,他们必须抛出不兼容维度的错误以进行乘法。但是它没有显示,并且它们在两种情况下都计算结果。

2 个答案:

答案 0 :(得分:5)

numpy编程的方式意味着一维数组shape=(n,)被视为既不列或行向量,但可以行为类似任何一个基于点积中的位置。为了更好地解释这一点,可以考虑将不对称数组的情况与对称数组进行比较:

>>>a=numpy.arange(3)
>>>a.shape=(1,3)
>>>a
array([0,1,2])

>>>b=numpy.arange(9)
>>>b.shape=(3,3)
>>>b
array([0,1,2]
      [3,4,5]
      [6,7,8])

然后定义一个(3,)向量:

>>>c=numpy.arange(3)
>>>c
array([0,1,2])
>>>c.shape
(3,)

在正常线性代数中,如果c是列向量,我们期望a.c用3x1列向量形成一个常量的1x3矩阵点,c.a用于产生3x3矩阵,3x1列乘以1x3行。在python中执行此操作,您会发现a.dot(c)将生成一个(1,)数组(我们期望的常量),但c.dot(a)将引发错误:

>>>d=a.dot(c)
d.shape=(1,)
>>>e=c.dot(a)
ValueError: shapes (3,) and (1,3) not aligned: 3 (dim 0) != 1 (dim 0)

出现问题的是,numpy已经针对a的第一个维度检查了c的 only 维度,而没有检查c的 last 维度。根据numpy ,1D数组只有1维,所有检查都是针对该维度完成的。因此,我们发现1D数组不严格地作为列或行向量。例如。 b.dot(c)检查b的第二维与c的一维(c 行为,如列向量),c.dot(b)检查c的一维与b的第一维(c) 行为就像行向量一样)。因此,他们都工作:

>>>f=b.dot(c)
>>>f
array([ 5, 14, 23])

>>>g=c.dot(b)
>>>g
array([15, 18, 21]) 

为了避免这种情况,必须为数组提供第二个维度,使其成为行或列向量。在此示例中,您明确说明列c.shape=(3,1)或列矢量c.shape=(1,3)

>>>c.shape=(3,1)
>>>c.dot(a)
array([0,0,0]
      [0,1,2]
      [0,2,4])
>>>h=c.dot(b)
ValueError: shapes (3,1) and (3,3) not aligned: 1 (dim 1) != 3 (dim 0)


>>>c.shape=(1,3) 
>>>i=c.dot(b)
>>>i
array([[15, 18, 21]])

从中可以看出: 根据numpy,行和列向量有两个维度

答案 1 :(得分:0)

首先,a=np.array([[1,2],[3,5])更改为a=np.array([[1,2],[3,5]])才能工作

numpy数组是一个值网格,所有类型都相同,并由非负整数元组索引。维数是数组的排名;数组的形状是一个整数元组,给出了每个维度的数组大小。

回答你的问题b形状是2,即行大小。

a = np.array([1, 2, 3])
a.shape
(3,) #here 3 is row size its one dimensional array. 

点操作员:

numpy.dot

示例:

np.dot(2, 4)
8

2D数组的另一个例子:

>>> a = [[1, 0], [0, 1]]
>>> b = [[4, 1], [2, 2]]
>>> np.dot(a, b)
array([[4, 1],
       [2, 2]])
  • 点函数,用于计算向量的内积,将向量乘以矩阵,以及乘以矩阵。

  • Dot既可以作为numpy模块中的函数使用,也可以作为数组对象的实例方法使用

  

对于二维阵列,它相当于矩阵乘法,对于1-D   阵列到载体的内积(没有复共轭)。对于   N维是a和a的最后一个轴上的和积   b的倒数第二个:

他们如何计算?

  

b.dot(a)也是可能的并且导致数组([21,36])并且这被吹了   我的想法。他们如何检查矢量的兼容性   矩阵乘法以及它们如何计算?

这是基本的matrix product

     a
    array([[1, 2],  #2D array 
           [3, 5]])
    >>> b
    array([3, 6]) #1D array 

(7*3 6*6) = ([21, 36])