2017-04-05 105 views
0

的产品,我理解numpy的点功能背后的工作有一个问题,broadcasting.Below是片断我想了解Np个阵列点矢量和阵列

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然后b必须是2 * 1。这是否证实b是列向量,否则如果它是行向量,则不可能进行矩阵乘法,但点积的输出确实给出根据矩阵乘法的值,考虑b作为列向量并将其广播

现在b.dot(a)也可以在 array([21,36])和 这个吹我mind.How他们在检查矩阵乘法矢量的兼容性以及他们是如何计算的结果吗? 在至少一个场景中,它们必须抛出乘法的不兼容维度的错误。但它没有显示,它们正在计算两种情况下的结果。

+0

一个= np.array([[1,2],[3,5 ])这必须是a = np.array([[1,2],[3,5]])。阵列产品和矩阵产品是不同的。我建议你通过差异 – LethalProgrammer

回答

4

该numpy的被编程的方式意味着,一维数组,shape=(n,),作为任一列或基于在点积的位置的行向量处理。为了更好地解释这一考虑的情况下,与非对称排列比较对称阵:

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

>>>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,) 

现在,我们希望交流要罚款,2×3用3x1打点,但加上一个错误。这样做在Python中,你会发现,a.dot(c)会产生(2)阵列和c.dot(a)会引发错误:

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

什么numpy的已经在这里做了检查C的只有维度对的第一维a,没​​有检查最近的尺寸c对a。根据numpy 一维数组只有一维,并且所有检查都是针对该维度完成的。因此,我们发现b.dot(c)检查b的第二维对c的一维,并且c.dot(b)检查c的一维对b的第一维。因此,他们都工作

>>>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) 
>>>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

'A的最后(或唯一)暗淡与B'的倒数第二'在大多数情况下描述'点(A,B)'。 – hpaulj

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]]) 
  • 的点函数来计算矢量的内积,通过矩阵相乘的矢量,并且相乘的矩阵。

  • 点有两种形式的numpy的模块中的功能和作为阵列的实例方法对象

For 2-D arrays it is equivalent to matrix multiplication, and for 1-D arrays to inner product of vectors (without complex conjugation). For N dimensions it is a sum product over the last axis of a and the second-to-last of b:

他们如何计算?

b.dot(a) is also possible and results in array([21,36])and this blew my mind.How are they checking the compatibility of the vector for matrix multiplication and how do they calculate?

这是基本的matrix product

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

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