mercredi 15 juin 2016

Building a matrix of 'rolled' rows efficiently in Numpy


I'd like to construct a (n,n)-array from a one dimensional array, where each row is shifted (with wrapping) by one relative to the previous one. The following code does this:

import numpy as np

r = np.array([1, 2, 3, 4, 5])
n = len(r)
MM = np.zeros((n, n), dtype=r.dtype)
for k in range(n):
    MM[k, :] = np.roll(r, k)

print(MM)

which results in:

[[1 2 3 4 5]
 [5 1 2 3 4]
 [4 5 1 2 3]
 [3 4 5 1 2]
 [2 3 4 5 1]]

Is there a way to do this Numpy faster, i.e., avoiding the for-loop, for large r in Numpy?


Aucun commentaire:

Enregistrer un commentaire