умножение вектора матрицы numpy [дубликат]



этот вопрос уже есть ответ здесь:

  • как отличается умножение для классов numpy Matrix vs Array? 7 ответов

когда я умножаю два массива numpy размеров(n x n)*(n x 1), я получаю матрицу размера (n x n). Следуя обычным правилам умножения матриц, ожидается вектор (n x 1), но я просто не могу найти его информация о том, как это делается в модуле numpy Python.

дело в том, что я не хочу реализовывать его вручную, чтобы сохранить скорость программы.

пример кода показан ниже:

a = np.array([[ 5, 1 ,3], [ 1, 1 ,1], [ 1, 2 ,1]])
b = np.array([1, 2, 3])

print a*b
   >>
   [[5 2 9]
   [1 2 3]
   [1 4 3]]

то, что я хочу:

print a*b
   >>
   [16 6 8]
180   1  

1 ответ:

простое решение

использовать numpy.dot или a.dot(b). Смотрите документацию здесь.

>>> a = np.array([[ 5, 1 ,3], 
                  [ 1, 1 ,1], 
                  [ 1, 2 ,1]])
>>> b = np.array([1, 2, 3])
>>> print a.dot(b)
array([16, 6, 8])

это происходит потому, что массивы numpy не являются матрицами, а стандартные операции *, +, -, / работа по элементам на массивах. Вместо этого вы можете попробовать использовать numpy.matrix и * будет рассматриваться как умножение матриц.


Других Решений

также знаю, что есть другие опции:

  • как указано ниже, при использовании python3. 5+ The @ оператор работает так, как вы ожидали:

    >>> print(a @ b)
    array([16, 6, 8])
    
  • если вы хотите, перебор, вы можете использовать numpy.einsum. Документация даст вам вкус к тому, как это работает, но, честно говоря, я не совсем понял, как его использовать, пока не прочитал ответ и просто играю с ним сам по себе.

    >>> np.einsum('ji,i->j', a, b)
    array([16, 6, 8])
    
  • по состоянию на середина 2016 года (numpy 1.10.1), вы можете попробовать экспериментальный numpy.matmul, который работает numpy.dot С двумя основными исключениями: нет скалярного умножения, но он работает со стеками матриц.

    >>> np.matmul(a, b)
    array([16, 6, 8])
    
  • numpy.inner функционирует так же, как и numpy.dotдля умножения матриц-векторов, но ведет себя по-разному для матрицы-матричного и тензорного умножения (см. Википедию о различиях между внутренний продукта и скалярное произведение в целом и смотрите это так ответ относительно реализаций numpy).

    >>> np.inner(a, b)
    array([16, 6, 8])
    
    # Beware using for matrix-matrix multiplication though!
    >>> b = a.T
    >>> np.dot(a, b)
    array([[35,  9, 10],
           [ 9,  3,  4],
           [10,  4,  6]])
    >>> np.inner(a, b) 
    array([[29, 12, 19],
           [ 7,  4,  5],
           [ 8,  5,  6]])
    

более редкие варианты для крайних случаев

  • если у вас есть тензоры (массивы размерности больше или равен единице), вы можете использовать numpy.tensordot С необязательным аргументом axes=1:

    >>> np.tensordot(a, b, axes=1)
    array([16,  6,  8])
    
  • не используйте numpy.vdot если у вас есть матрица комплексных чисел, так как матрица будет сглажена до 1D массива, то она попытается найти комплексное сопряженное точечное произведение между вашей сглаженной матрицей и вектором (что не удастся из-за несоответствия размера n*m vs n).

    Ничего не найдено.

Добавить ответ:
Отменить.