numpyで効率的に行列を作りたい


ある整数Nを与えたら、以下のようなN×N-1の行列Zを出力するようなプログラムを書きたいです。

[code]

    Z = [[1 2 3 ... N]
         [0 2 3 ... N]
         [0 1 3 ... N]
          ...
         [0 1 2 ... N]
         [0 1 2 ... N-1]]
    
[/code]

つまり、i番目の行は、iを除くすべての値を持っているような行列です。単純なコードを書くと

[code]

    Z = [[j for j in range(N) if j != i] for i in range(N)]
    
[/code]

となるのですが、Nが大きくなると時間がかかってしまいます。

このようなことを、numpyで効率的に書くにはどうすれば良いでしょうか？




こんな感じでどうでしょうか。for文は使わないようにしてみました。

[code]

    import numpy as np
    
    N = 4
    Z = np.zeros((N, N), dtype=int)
    Z += np.arange(N)
    Z = Z[np.eye(N, N) == 0].reshape(N, N - 1)
    
[/code]




こんな感じでどうでしょうか。for文は使わないようにしてみました。

[code]

    import numpy as np
    
    N = 4
    Z = np.zeros((N, N), dtype=int)
    Z += np.arange(N)
    Z = Z[np.eye(N, N) == 0].reshape(N, N - 1)
    
[/code]

