It is pretty easy and convenient to write extensions using pybind11, including passing numpy arrays. It takes 10 lines in setup.py and around 10 lines in a .cpp file, run setup.py build_ext to build it. Not quite the convenience of inline - but in practice pretty nice.
My only nit in that compile time is around 3 seconds on my machine.