[SciPy-user] Shift the rows of a matrix

Robert Kern robert.kern at gmail.com
Sun Nov 16 19:49:52 EST 2008


On Fri, Nov 7, 2008 at 03:12, Roger Herikstad <roger.herikstad at gmail.com> wrote:
> Hi list,
>  I was curious if anyone has a good method of shifting individual rows
> of a matrix? My problem is that I have a matrix consisting of
> waveforms on the rows, and I want to shift each waveform, i.e. pad
> with zeros on either end, depending on where the minimum point of each
> waveform is located relative to a pre-determined zero point. For
> example, if each waveform consists for 32 data points, I would be
> interested in aligning each waveform so that the minimum point always
> happens on index 10. My current solution is to loop through each
> waveform and taking the dot product with a shift matrix, but I'd
> rather avoid the for loop if possible. If anyone has any thoughts, I'd
> be happy for any input. Thanks!

You can do this with fancy indexing. Find the minimum index across the rows:

  jmin = x.argmin(axis=1)

Shift this to correspond to row indices in the new array such that the
minimum will be on index 10 (note: I suspect you will need to pad to
at least 2*32 and place the minimum in the center to be safe, but you
know your problem better than I).

  jmin_shift = 10 - jmin

Turn this array into a column vector and add it to arange(32) to
create an index array of the same size as the original array:

  j = jmin_shift[:,np.newaxis] + np.arange(32)

These are row indices. To get the column indices which we will need,
we can use just a column vector of the right size. Broadcasting will
handle the rest:

  i = np.arange(len(x))[:,np.newaxis]

Use these to set the values in the new array:

  y[i,j] = x

-- 
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless
enigma that is made terrible by our own mad attempt to interpret it as
though it had an underlying truth."
  -- Umberto Eco



More information about the SciPy-User mailing list