我在理解numpy dot功能和广播背后的工作时遇到了问题.Below是我试图理解的片段
a=np.array([[1,2],[3,5]])
如果我们检查一下的形状
a.shape
它将是(2,2)
b=np.array([3,6])
和b.shape is (2,)
b
列向量还是行向量?在提供输入的同时,似乎b
是行向量,但是形状将其显示为具有2行的列向量。我理解的错误是什么?
现在如果可以的话
a.dot(b)
它导致了
array([15,39])
问题2:根据矩阵乘法,如果a
为m*n
,则b
必须为n*k
,且a
为2 * 2,然后{{1}必须是2 * 1。这是否验证b
是列向量,否则如果它是行向量则矩阵乘法不可能,但点积的输出确实根据矩阵乘法给出值b
作为列向量并广播它
现在b
也是可能的,并且会产生结果
b.dot(a)
,并
这引起了我的注意。他们如何检查向量的矩阵乘法的兼容性以及它们如何计算?
在至少一个场景中,他们必须抛出不兼容维度的错误以进行乘法。但是它没有显示,并且它们在两种情况下都计算结果。
答案 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.
点操作员:
示例:
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])