Вот возьмём простую функцию numpy.sin. Если в качестве аргумента в неё передать array-like, то функция будет применена к каждому аргументу и на выходе будет numpy.array, если на вход передать скаляр, то на выходе будет скаляр. Как это внутри организовано? В моем дистрибутиве python в теле функции numpy.sin просто стоит pass. Как организовывать функции в питоне по вот такому принципу
if a.isscalar
f(a)
else
map(f,a)