Вычислительный продукт i-й строки массива1 и i-й столбец array2 – NumPy

У меня есть матрица M1 формы (N*2) и другая матрица M2 (2*N) , я хочу получить результат (N) , каждый элемент i является произведением i й строки M1 и i го столбца M2 . Я попытался использовать точку в NumPy, но это может дать только результат умножения матрицы, который (N*N) , конечно, я могу взять диагональ, что я хочу, я хотел бы знать, есть ли лучше способ сделать это?

  • Ошибка Selenium Python при попытке запустить firefox
  • Динамическая печать терминала с помощью python
  • Возможно ли открыть определенные веб-адреса, используя интернет-браузер по умолчанию с помощью python?
  • Обнаружение зависания сокета без отправки или получения?
  • добавить пользователя в mongodb через python
  • Преобразование системной команды в python для поиска и удаления файлов
  • pytz: Почему нормализация необходима при переходе между часовыми поясами?
  • Самый быстрый способ увеличить числовой числовой массив
  • One Solution collect form web for “Вычислительный продукт i-й строки массива1 и i-й столбец array2 – NumPy”

    Подход №1

    Вы можете использовать np.einsum

     np.einsum('ij,ji->i',M1,M2) 

    Объяснение:

    Исходное решение loopy будет выглядеть примерно так:

     def original_app(M1,M2): N = M1.shape[0] out = np.zeros(N) for i in range(N): out[i] = M1[i].dot(M2[:,i]) return out 

    Таким образом, для каждой итерации мы имеем:

     out[i] = M1[i].dot(M2[:,i]) 

    Если посмотреть на итератор, нам нужно выровнять первую ось M1 со второй осью M2 . Опять же, поскольку мы выполняем matrix-multiplication и что по его самому определению выравнивает вторую ось M1 с первой осью M2 а также суммирует эти элементы на каждой итерации.

    При переносе на einsum держите оси, которые должны быть выровнены между двумя входами, чтобы иметь одну и ту же строку при указании на нее нотации. Таким образом, входы будут 'ij,ji для M1 и M2 соответственно. Результат после потери второй строки из M1 , которая аналогична первой строке из M2 в этом сокращении суммы, должна быть оставлена ​​как i . Таким образом, полное строковое обозначение будет: 'ij,ji->i' и окончательное решение как: np.einsum('ij,ji->i',M1,M2) .

    Подход №2

    Количество столбцов в M1 или количество строк в M2 равно 2 . Итак, в качестве альтернативы, мы можем просто нарезать, выполнить умножение по элементам и суммировать их, например:

     M1[:,0]*M2[0] + M1[:,1]*M2[1] 

    Тест времени выполнения

     In [431]: # Setup inputs ...: N = 1000 ...: M1 = np.random.rand(N,2) ...: M2 = np.random.rand(2,N) ...: In [432]: np.allclose(original_app(M1,M2),np.einsum('ij,ji->i',M1,M2)) Out[432]: True In [433]: np.allclose(original_app(M1,M2),M1[:,0]*M2[0] + M1[:,1]*M2[1]) Out[433]: True In [434]: %timeit original_app(M1,M2) 100 loops, best of 3: 2.09 ms per loop In [435]: %timeit np.einsum('ij,ji->i',M1,M2) 100000 loops, best of 3: 13 µs per loop In [436]: %timeit M1[:,0]*M2[0] + M1[:,1]*M2[1] 100000 loops, best of 3: 14.2 µs per loop 

    Массивное ускорение там!

    Python - лучший язык программирования в мире.