Я думаю, что Numpy C API - это хороший подход. Вы все еще можете использовать SWIG. Но я бы настоятельно рекомендовал не использовать типографские карты SWIG, они очень сложные. Вместо этого вы можете принимать и возвращать массивы Numpy в виде указателя PyObject * в вашей подписи SWIG и создавать / извлекать их, используя C API. SWIG обернет это правильно.
Если это ваше первое расширение Python, обязательно прочитайте введение Python C API . По крайней мере, вам нужно знать контракт API для подсчета ссылок.
Другой вариант - реализовать буферный протокол API , который понимает numpy.
Еще один вариант - Boost.Python , если вам не нравится код C в мире C ++. У меня нет опыта с этим. Лично мне нравится Python C API из-за его низкой сложности.