为什么numpy向量矩阵点积会删除多余的零

时间:2019-01-06 05:31:44

标签: python numpy

我希望对矩阵m(2,6)和向量v(6,)应用点积运算

结果矢量的形状应为(6,)

当我自己在python中实现逻辑时,我得到了上面要求的结果。一个大小为6的向量。但是,如果我使用np.dot(m,v),则会得到相同的结果,但会删除多余的零点

为什么会这样?请帮助。下面的代码

def vector_matrix_multiplication_using_numpy(m, v):
    ''' 
        this is where we multiply a matrix with a vector
        remember it is important that m.shape[1] == v.shape[0]
        also m is a 2D tensor

        resultant will be a vector of the shape
        (m.shape[0])

    '''
    assert len(m.shape) == 2
    assert len(v.shape) == 1
    assert m.shape[1] == v.shape[0]

    return np.dot(m,v)





def vector_matrix_multiplication_using_python(m, v):
    ''' 
        this is where we multiply a matrix with a vector
        remember it is important that m.shape[1] == v.shape[0]
        also m is a 2D tensor

        resultant will be a vector of the shape
        (m.shape[0])

    '''
    assert len(m.shape) == 2
    assert len(v.shape) == 1
    assert m.shape[1] == v.shape[0]

    z = np.zeros((m.shape[1])).astype(np.int32)

    for i in range(m.shape[0]):
        z[i] = vector_multiplication_using_python(m[i, :],v)

    return z


    m = np.random.randint(2,6, (3,7))
    v = np.random.randint(5,17, (7))
    print(vector_matrix_multiplication_using_numpy(m,v),\
                vector_matrix_multiplication_using_python(m, v))

输出如下:

[345 313 350] [345 313 350   0   0   0   0]

编辑:

我不正确。向量乘法矩阵如下 m =(n,p)形状 v =(p,)形状

结果输出为v =(n)形状 此代码中的特定修改解决了以下问题:

z = np.zeros((m.shape[0])).astype(np.int32)

1 个答案:

答案 0 :(得分:1)

当我打印您的示例时,m和v形状如下: m:(3, 7) n:(7,) numpy点积输出如下:

[305 303 319]

这实际上是正确的,因为您看到输出的shape(3x7)点shape(7)==> shape(3,)形状。所以这是正确的。然后,您的python实现一定有问题。我要求您分享整个代码或亲自研究一下。希望能帮助到你。随时询问您是否还有其他问题。 :)

编辑:

请注意,您在这里做错了。

z = np.zeros((m.shape[1])).astype(np.int32)

您在此处分配7个零,您的输出采用前三位数字,其余零保持不变。因此,要回答您的问题,numpy不会删除零,而是要添加额外的零,这是错误的!

您可以执行z = np.zeros((m.shape[0])).astype(np.int32),我认为这可以解决问题。 :)欢呼!!