Python 形状(2,)(3,1)的Numpy点覆盖给出错误,但乘法不';T
我想澄清一下广播规则和乘法因子上的numpy.dot方法。我已经创建了两个形状(2,)和(3,)的数组,它们可以通过添加一个新轴(3,1形状)来相乘,但即使添加一个新轴并转换为(3,1)形状,也无法通过np.dot方法实现。下面是一个小测试Python 形状(2,)(3,1)的Numpy点覆盖给出错误,但乘法不';T,python,numpy,matrix-multiplication,Python,Numpy,Matrix Multiplication,我想澄清一下广播规则和乘法因子上的numpy.dot方法。我已经创建了两个形状(2,)和(3,)的数组,它们可以通过添加一个新轴(3,1形状)来相乘,但即使添加一个新轴并转换为(3,1)形状,也无法通过np.dot方法实现。下面是一个小测试 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.0907
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)
我理解(2,1)和(1,3)的np.dot是有效的,但为什么(2,1)和(3,1)不行呢?因为广播规则第二条说,当其中一个是1时,两个维度是相容的。所以,如果其中一个维度是1,np.dot应该起作用,或者我对第二条规则理解错了吗?这也是为什么X_9(乘法)有效,而X_8(np.dot)无效,因为两者的形状相同。np.dot用于矩阵乘法(其中列向量可以被视为一列矩阵,行向量可以被视为一行矩阵)。 *(乘法)在参数之一为标量的情况下用于标量乘法,反之亦然。因此,广播规则不适用于np.dot。 x_9之所以有效,是因为正如这里的广播规则所述 在两个阵列上操作时,NumPy会按元素比较它们的形状。它从后面的维度开始,然后继续前进。当需要时,两个维度是兼容的
因此,x_1的(唯一)维度(即2)与x_2的最后一个维度(即1,因为添加了新维度)兼容,而剩余维度为3
广播
规则不适用于dot
。您希望dot
如何处理2个1d阵列?或者使用已扩展为2d的2?内积?Outter?@hpaulj我所研究的方程,δ=wf(h)试图得到内积。最后是一个标量值。所以我打算在numpy乘法上使用np.dot方法,以便更好地理解应该在哪里使用np.dot和numpy乘法。对此有何建议/经验?谢谢,我在广播文档中没有发现np.dot不适用于它们。“在数学中,点积或标量积是一种代数运算,它接受两个等长的数字序列(通常是坐标向量),并从wiki返回一个数字。请注意等长规格。