As far as I understand, and hopefully someone will correct me if I’m wrong:

standard numpy arrays reside only in cpu memory
therefore, a cuda tensor must first be sent to the cpu before it can be converted to numpy

If your question is really ‘why doesn’t calling .numpy on a cuda tensor send it to cpu by default, without the user having to specify?’, I don’t know. Surely there is a technical reason, that hopefully someone else can elaborate. You could of course write your own function to do both in one step, if you really want to avoid writing .cpu().numpy() every time, e.g.:
def cudaToNumpy(cudaTensor):
    return cudaTensor.detach().cpu().numpy() #I add a detach in case the tensor has gradients etc