以下のような関数を作成したいと思っているのですが、任意の回数ループ処理を行う方法についてご教示賜りたいと存じます。

1.引数として、①任意の次元数のnumpy配列、②各次元に対応する処理を行う関数の2つをとる。
②すべての配列要素に対して処理を行う。ただし、その処理は引数として指定した関数に基づく。

この時、任意の回数のネストした処理の作成方法がわかりません。
例えば4次元配列なら、汚いですが

x = NDARRAY.shape
for i in range(x[0]):
    for j in range(x[1]):
        for k in range(x[2]):
            for l in range(x[3]):

とでもできますが、一般にn次元の時、どのようにすればよいでしょうか。
メタプログラミングの知識は必要でしょうか。