Почему продукт с точечной векторной матрицей удаляет лишние нули - PullRequest
0 голосов
/ 06 января 2019

Я хочу применить операцию точечного произведения к матрице 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]

EDIT:

я ошибся. матрица с векторным умножением работает как показано ниже m = (n, p) форма v = (p,) форма

результирующий вывод v = (n) формы это конкретное изменение в коде исправило проблему:

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

1 Ответ

0 голосов
/ 06 января 2019

Когда я печатаю ваш пример, формы m и v выглядят следующим образом: м: (3, 7) п: (7,) Выход продукта numpy dot выглядит следующим образом:

[305 303 319]

Что на самом деле правильно, потому что вы видите shape (3x7) dot shape (7) ==> shape (3,) shape вывода. Так что это правильно. Там должно быть что-то не так с вашей реализацией Python. Я прошу вас поделиться всем кодом или изучить его самостоятельно. Надеюсь, поможет. Не стесняйтесь спрашивать, если у вас есть дополнительные вопросы. :)

Edit:

Обратите внимание, что вы делаете это неправильно здесь.

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

вы назначаете здесь 7 нулей, ваш вывод занимает первые три цифры, остальные нули остаются неизменными. Поэтому, чтобы ответить на ваш вопрос, numpy не удаляет нули, вы добавляете лишние нули, что неправильно!

вы можете сделать z = np.zeros((m.shape[0])).astype(np.int32), и я думаю, что это решит проблему. :) ура !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...