Я не уверен, было ли это задано раньше. Я не смог найти много релевантных результатов в SO или Google. Во всяком случае, вот что я пытаюсь сделать. У меня есть функция, которая создается во время выполнения, которая принимает 4 параметра.Векторизация/ускорение функции numpy с двумя аргументами разных размеров
My_function (т, х, р, а)
т является скаляром с плавающей точкой
Х представляет собой 1D Numpy массив поплавки
р и словари
У меня есть Numpy массив T и массив 2D numpy X. Я хочу вызвать функцию с каждым элементом из T и каждым столбцом X и сохранить результат в другом массиве numpy. Функция возвращает массив numpy, который формирует столбец решения. Мой текущий, наивный, очень unpythonic реализация выглядит следующим образом:
for i in range(len(T)):
_u = my_func(T[i],X[:,i],p,a)
sol.u[:,i] = _u # The length of u is unrelated to the other variables
Я мог бы я использовал numexpr, если он позволил пользовательские функции. Я также посмотрел на numpy.vectorize и пытался использовать его как это:
f = np.vectorize(my_func)
f.excluded.add(2)
f.excluded.add(3)
f(T,X,p,a)
Это дает мне ошибку «IndexError: неверный индекс к скалярной переменной» где-то внутри функции. Я, очевидно, не понимаю, как работает бесчисленное вещание.
Возможно ли это, используя np.vectorize?
Или есть способ использования np.apply_along_axis?
Другая возможность, которую я вижу, - это нарезка массивов заранее и формирование списка кортежей с правильными аргументами и использование их с некоторой формой функциональности «карты».
Update: Еще одно решение я нашел:
f = lambda _t, _X: my_func(_t,_X,p,a)
u = np.array(list(map(f, T, list(X.T)))).T
Это похоже на работу. Но это самый эффективный способ сделать это?
Обновление 2: Вот пример функции:
def my_func(_t,_X,_p,_aux):
[x,y,v,lamX,lamY,lamV,tf,] = _X[:7]
g = _aux['const']['g']
theta = -2*atan((lamX*v + sqrt(g**2*lamV**2 - 2*g*lamV*lamY*v + lamX**2*v**2 + lamY**2*v**2))/(g*lamV - lamY*v))
return theta
, где приведен пример _aux будет:
_aux = {'const': {'g':-9.81} }
_t и _p не используются в данном случае. Он ожидает, что _X будет 7-элементным вектором. В этом случае функция возвращает только одно значение. Но могут быть случаи, когда он возвращает список. В этом случае возвращаемое значение формирует столбец на выходе. Надеюсь, что немного прояснит ситуацию.
Покажите нам свою функцию. Есть хорошая вероятность, что его можно изменить, чтобы принять 2D-массив как параметр «X» и транслировать по столбцам. –
Добавлена функция выборки –