Python / numpy - эффективность тензорной записи и нормальных матриц - PullRequest
0 голосов
/ 12 марта 2019

Надеюсь, этот вопрос не будет звучать странно.Я собираюсь написать код на Python, чтобы имитировать некоторые оптические нелинейности в волноводах, и мне было интересно, какова наиболее эффективная система обозначений, которую я могу использовать для экономии времени и энергии.Я пришел из опыта MatLab, где все говорят вам, что матрицы намного эффективнее циклов, но сейчас, в большинстве случаев, я использую тензорную нотацию (например, в FORTRAN умножение матриц приведет к чему-то вроде , что:

subroutine aa_dot_bb(n,a,b,c)
  dimension a(n,n), b(n,n), c(n,n)
  do i = 1,n
     do j = 1,n
        c(i,j) = 0
        do k = 1,n
           c(i,j) = c(i,j) + a(i,k) * b(k,j)
        end do
     end do
  end do
  return
  end

Кто-нибудь знает, что является более эффективным в Python и NumPy? Заранее большое спасибо!

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

В мире Python и NumPy он такой же, как в Matlab, так что, как вы упомянули, циклы for медленны, а матричные операции, выраженные нативными NUMPY, быстры, поэтому ваша цель состоит в том, чтобы векторизовать все операции так, как вы бы это сделали. сделать в матлаб. Numpy ведет себя очень похоже на Matlab. Если вы знакомы с Matlab, я рекомендую вам numpy для документации пользователей Matlab . Но, как упоминает @ntipakos, это можно выразить как умножение матриц, которое можно записать как

a = np.array([[1, 0],[0,1]])
b = np.array([[4, 1],[2,2]])
y = np.matmul(a, b)
y = a @ b    # alternative notation using @ operator
0 голосов
/ 12 марта 2019

вы просто попросите умножить матрицу?

a = np.array([[1, 0],[0,1]])
b = np.array([[4, 1],[2,2]])
y = np.matmul(a, b)
...