Ao procurar a versão de intervalo 2-pi de np.atan (que, na verdade, é np.atan2), descobri que também existe um np.arctan. Existe alguma diferença entre np.arctan e np.atan? O teste abaixo não parece mostrar nenhuma diferença entre atan e arctan, ou entre atan2 e arctan2:
import numpy as np
for i in np.arange(0,2*np.pi,.1):
x = np.cos(i)
y = np.sin(i)
th = np.atan(y/x)
th2 = np.atan2(y,x)
th3 = np.arctan(y/x)
th4 = np.arctan2(y,x)
print(f'atan {th} atan2 {th2} arctan {th3} arctan2 {th4}')