2017-06-18 79 views
0

我正在寻找关于乘法因子上的广播规则和numpy.dot方法的一些说明。我创建了两个形状(2,)和(3,)的数组,它们可以通过添加一个新的轴(3,1形状)相乘,但它不能通过np.dot方法,即使添加了一个新轴并转动变成(3,1)形状。下面是一些小测试。Numpy dot形状(2,)(3,1)给出了错误,但乘法不是

x_1 = np.random.rand(2,) 
print(x_1) 
x_2 = np.random.rand(3,) 
print(x_2) 
> [ 0.48362051 0.55892736] 
> [ 0.16988562 0.09078386 0.04844093] 

x_8 = np.dot(x_1, x_2[:, np.newaxis]) 
> ValueError: shapes (2,) and (3,1) not aligned: 2 (dim 0) != 3 (dim 0) 

x_9 = x_1 * x_2[:, np.newaxis] 
print(x_9) 
> [[ 0.47231067 0.30899592] 
    [ 0.17436521 0.11407352] 
    [ 0.01312074 0.00858387]] 

x__7 = x_1[:, np.newaxis] * x_2[:, np.newaxis] 
> ValueError: operands could not be broadcast together with shapes (2,1) (3,1) 

我明白np.dot的(2,1)&(1,3)的作品,但为什么不(2,1)&(3,1),因为广播规则二说,两个维度当它们中的一个是1时是兼容的。因此,如果它的一个维度是1,那么np.dot应该工作,或者我理解了第二个规则是错误的?此外,为什么X_9工作(乘法)而不是x_8(np.dot),两者都是相同的形状。

+1

“广播”规则不适用于“点”。 – hpaulj

+0

你对2个1d数组有什么期待'dot'?或者2扩展到2d?内在产品? Outter? – hpaulj

+0

@hpaulj我正在处理的等式δ= W f(h)试图获得内积。最终的标量值。所以我正在努力在np.dot方法上使用numpy乘法来更好地理解,并且我应该使用np.dot和numpy乘法。任何建议/经验要知道吗?并且,谢谢,在广播文档中没有发现np.dot不适用于他们。 –

回答

1

np.dot用于矩阵 - 矩阵乘法(其中列向量可以被认为是具有一列的矩阵并且行向量是具有一行的矩阵)。 *(乘法)用于在其中一个参数是标量的情况下进行标量乘法,否则进行广播。所以广播规则不适用于np.dot。 x_9工作,因为,作为广播规则的两个数组这里https://docs.scipy.org/doc/numpy-1.12.0/user/basics.broadcasting.html

工作时指出,NumPy的逐元素的它们的形状进行比较。它从尾随的维度开始,并朝着前进的方向前进。两个维度是兼容时

  1. 它们相等,或
  2. 它们中的一个是1

所以X_1你(只)尺寸,(这是2)是与所述兼容x_2的最后一个维度(因为您添加了新的维度,因此为1),其余维度为3.

相关问题