Я noobie для python и numpy (и программирования вообще). Я стараюсь максимально ускорить мой код. Математика включает в себя несколько суммирования по нескольким осям нескольких массивов. Я достиг одного уровня векторизации, но мне кажется, что я не могу глубже понять это и должен прибегать к циклам (я считаю, что есть три уровня рекурсии: M, N и я, один из которых я исключено, I). Вот мой код для соответствующего раздела (этот код работает, но я хотел бы, чтобы ускорить его):Как векторизовать несколько уровней рекурсии?
def B1(n, i):
return np.pi * n * dmaxi * (-1)**(n+1) * np.sin(qi[i]*dmaxi) * ((np.pi*n)**2 - (qi[i]*dmaxi)**2)**(-1)
for n in N:
B[n, :] = B1(n, I)
for m in M:
for n in N:
C[m, n] = np.dot((1/np.square(qi*Iq[0, :, 2]))*B[m, :], B[n, :])
Y[m] = np.dot((1/np.square(qi*Iq[0, :, 2]))*U[0, :, 1], B[m, :])
A = np.linalg.solve(C[1:, 1:], (0.25)*Y[1:])
dmaxi только поплавок и т, п и я целые числа. Массивы имеют следующие формы:
>>> qi.shape
(551,)
>>> N.shape
(18,)
>>> M.shape
(18,)
>>> I.shape
(551,)
>>> Iq.shape
(1, 551, 3)
>>> U.shape
(1, 551, 3)
Как вы можете видеть, я векторизованы расчет 2-ой оси В, но я не могу сделать это за 1-ой оси, С и Y, которые по-прежнему требуют циклов for. Похоже, что когда я пытаюсь сделать ту же самую форму векторизации, которую я сделал для 1-й оси B (определите функцию, затем передайте массив как аргумент), я получаю ошибку вещания, так как она пытается вычислить как осей одновременно, а не 1-го, затем 2-го, поэтому мне пришлось вынудить его в цикл for. Такая же проблема возникает как для C, так и для Y, поэтому они также подходят для циклов. В случае это сбивает с толку, по существу, что я попытался было:
>>> B[:, :] = B1(N, I)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "sasrec_v6.py", line 155, in B1
return np.pi * n * dmaxi * (-1)**(n+1) * np.sin(qi[i]*dmaxi) * ((np.pi*n)**2 - (qi[i]*dmaxi)**2)**(-1)
ValueError: operands could not be broadcast together with shapes (18) (551)
Векторизация 2-ой оси B сделал значительное улучшение в скорости моего кода, поэтому я предполагаю, что то же самое будет применяться для дальнейшего векторизации (I надеюсь, что я правильно использую этот термин).
Введенный код при условии, что не используется рекурсия вообще. – aestrivex
Возможно, я использую этот термин неправильно. Я просто ссылаюсь на использование вложенных циклов. – tomerg
Итак, нижний регистр 'i' не является целым числом, а вектором, то же самое, что и в верхнем регистре' i'? –