Я хотел бы векторизовать вложенные суммы в Python, чтобы ускорить процесс.На данный момент я вложил в циклы.
for ja in np.arange(0,Na):
for jb in np.arange(0,Nb):
for ma in np.arange(-ja,ja+1):
...
Конечным результатом является сумма по матрицам 2x2, каждая из которых содержит записи, зависящие от значений ja, jb, ma, mb.Матрицы выглядят так:
[[f11(ja,jb,ma,mb),f12(ja,jb,ma,mb)],
[f21(ja,jb,ma,mb),f22(ja,jb,ma,mb)]]
, где fij - функции.Функции можно применять к массивам, так как они будут работать поэлементно (экспозиции, квадратные корни, триггерные функции и т. Д.).Я могу создать массивы, такие как:
ja=[0,0,0,1,1,1,2,2,2,3,3,3]
jb=[0,1,2,3,0,1,2,3,0,1,2,3]
Используя
range_a = np.arange(0,Na/2+1)
range_b = np.arange(0,Nb/2+1)
ja = np.tile(a_range,Nb/2+1)
jb = np.repeat(b_range,Na/2+1)
Но моя проблема в том, чтобы создать массивы, чтобы для каждого значения в приведенном выше j мы имели структуру m (из-j к j):
ma=[0,0,0,-1,-1,-1,0,0,0,1,1,1,-2,-2,-2,...]
mb=[0,-1,0,1,-2,-1,0,1,2,...]
У меня проблемы с созданием этих m массивов!каждый раз, когда структура -j, .., j повторяется, она имеет разную длину, поэтому я не могу использовать такие функции, как numpy.tile
и numpy.repeat
.Итак, есть какие-нибудь идеи о том, как это сделать?
Мои дальнейшие намерения могут быть уместны: я надеюсь, что смогу заполнить их нулями и построить матрицы 2 * длины, чтобы заполнить только одну запись (мне нужно4 матрицы для каждого вектора, всего 4 вектора).Затем я могу применить функции и добавить эти Upp.Чтобы вычислить суммирование по матрицам 2 * 2, я укажу произведение на матрицу длиной * 4 в форме.Результат 2 * 2.Возможно, лучшая стратегия существует?Я думал, что это могло произойти раньше, так как оно имеет общее применение в физике (трассировка по оператору плотности), но я не нашел его.