Ну то есть смотри, если ты применяешь к массиву (любой формы, хоть 10-мерному) np.sin, он внутри себя запустит сишный цикл, в котором к каждому элементу применит сишный синус. А если ты применяешь к каждому элементу питоновскую функцию, то ему приходится для каждого элемента дергать питоновский код, это медленно.
Выхода более-или-менее два:
а) если твою функцию можно записать без if, как композицию элементарных функций np, то это можно сделать "снаружи" (типа np.sin(np.pow(...)).
б) если нельзя, то можно попробовать другими способами ускорения воспользоваться, например, cython