[Numpy-discussion] an np.arange for arrays?
David Goldsmith
d_l_goldsmith@yahoo....
Fri Jul 10 12:26:22 CDT 2009
It's also 5 LOSC using linspace:
def interp_grid(x, y, nrows):
''' A linearly-interpolated (across rows) 2-D grid generator '''
## Put data quality checking here - confirm len(x) == len(y),
## nrows > 2, decide on behavior if inputs bad
ncols = len(x)
grid = np.zeros((nrows, ncols)) # allocate memory
for i in range(ncols):
grid[:,i] = np.linspace(x[i], y[i], nrows)
return grid
>>> nrows=10
>>> ncols = len(x)
>>> x; y; nrows, ncols
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
array([10, 11, 12, 13, 14, 15, 16, 17, 18])
(10, 9)
>>> def interp_grid(x, y, nrows):
... ncols = len(x)
... grid = np.zeros((nrows, ncols)) # allocate memory
... for i in range(ncols):
... grid[:,i] = np.linspace(x[i], y[i], nrows)
... return grid
...
>>> interp_grid(x, y, nrows)
array([[ 1., 2., 3., 4., 5., 6., 7., 8., 9.],
[ 2., 3., 4., 5., 6., 7., 8., 9., 10.],
[ 3., 4., 5., 6., 7., 8., 9., 10., 11.],
[ 4., 5., 6., 7., 8., 9., 10., 11., 12.],
[ 5., 6., 7., 8., 9., 10., 11., 12., 13.],
[ 6., 7., 8., 9., 10., 11., 12., 13., 14.],
[ 7., 8., 9., 10., 11., 12., 13., 14., 15.],
[ 8., 9., 10., 11., 12., 13., 14., 15., 16.],
[ 9., 10., 11., 12., 13., 14., 15., 16., 17.],
[ 10., 11., 12., 13., 14., 15., 16., 17., 18.]])
Or, if you prefer one-liners, using list comprehension:
grid = np.array([np.linspace(x[i],y[i],nrows) for i in range(len(x))]).T
(the transposing at the end is necessary 'cause the result of linspace is interpreted as a row vector, but you want the interpolated values in columns; if you can have your data be in the first and last columns and the interpolation be in the rows, you can omit the final .T)
>>> grid = np.array([np.linspace(x[i],y[i],nrows) for i in range(len(x))]).T
>>> grid
array([[ 1., 2., 3., 4., 5., 6., 7., 8., 9.],
[ 2., 3., 4., 5., 6., 7., 8., 9., 10.],
[ 3., 4., 5., 6., 7., 8., 9., 10., 11.],
[ 4., 5., 6., 7., 8., 9., 10., 11., 12.],
[ 5., 6., 7., 8., 9., 10., 11., 12., 13.],
[ 6., 7., 8., 9., 10., 11., 12., 13., 14.],
[ 7., 8., 9., 10., 11., 12., 13., 14., 15.],
[ 8., 9., 10., 11., 12., 13., 14., 15., 16.],
[ 9., 10., 11., 12., 13., 14., 15., 16., 17.],
[ 10., 11., 12., 13., 14., 15., 16., 17., 18.]])
DG
--- On Fri, 7/10/09, Chris Colbert <sccolbert@gmail.com> wrote:
> From: Chris Colbert <sccolbert@gmail.com>
> Subject: Re: [Numpy-discussion] an np.arange for arrays?
> To: "Discussion of Numerical Python" <numpy-discussion@scipy.org>
> Date: Friday, July 10, 2009, 7:44 AM
> Oh cool, I couldn't figure out with
> mgrid.
> here's what ended up with using broadcasting:
>
> >>> import numpy as np
> >>> X = np.zeros((10))
> >>> Y = np.arange(10, 20)
> >>> M = 10
> >>> increments = np.arange(1, M+1)
> >>> delta = Y - X
> >>> dl = (delta / M).reshape(-1, 1)
> >>> interps = dl * increments
> >>> lines = X + interps
> >>> lines
> array([[ 1. , 2.
> , 3. , 4.
> , 5. , 6.
> , 7. , 8.
> , 9. , 10. ],
> [
> 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9,
> 11. ],
> [
> 1.2, 2.4, 3.6, 4.8, 6.
> , 7.2, 8.4, 9.6,
> 10.8, 12. ],
> [
> 1.3, 2.6, 3.9, 5.2, 6.5, 7.8, 9.1,
> 10.4, 11.7, 13. ],
> [
> 1.4, 2.8, 4.2, 5.6, 7.
> , 8.4, 9.8,
> 11.2, 12.6, 14. ],
> [
> 1.5, 3.
> , 4.5, 6.
> , 7.5, 9. ,
> 10.5, 12. , 13.5, 15. ],
> [
> 1.6, 3.2, 4.8, 6.4, 8.
> , 9.6, 11.2, 12.8,
> 14.4, 16. ],
> [
> 1.7, 3.4, 5.1, 6.8, 8.5,
> 10.2, 11.9, 13.6, 15.3, 17. ],
> [
> 1.8, 3.6, 5.4, 7.2, 9.
> , 10.8, 12.6, 14.4, 16.2, 18.
> ],
> [
> 1.9, 3.8, 5.7, 7.6, 9.5,
> 11.4, 13.3, 15.2, 17.1, 19. ]])
>
>
>
>
> On Fri, Jul 10, 2009 at 4:49 AM, David Warde-Farley<dwf@cs.toronto.edu>
> wrote:
> >
> > On 10-Jul-09, at 1:25 AM, Chris Colbert wrote:
> >
> >> actually what would be better is if i can pass two
> 1d arrays X and Y
> >> both size Nx1
> >> and get back a 2d array of size NxM where the
> [n,:] row is the linear
> >> interpolation of X[n] to Y[n]
> >
> > This could be more efficient, but here's a solution
> using mgrid and
> > broadcasting:
> >
> > def interp_grid_thingie(X, Y, M):
> > frac = np.mgrid[0:1:M*1j]
> > return (1 - frac[np.newaxis, :]) * X[:,
> np.newaxis] +
> > frac[np.newaxis, :] * Y[:, np.newaxis]
> >
> > In [11]: interp_grid_thingie(arange(1,6), arange(0,5),
> 5)
> > Out[11]:
> > array([[ 1. , 0.75, 0.5 , 0.25, 0. ],
> > [ 2. , 1.75, 1.5 , 1.25, 1. ],
> > [ 3. , 2.75, 2.5 , 2.25, 2. ],
> > [ 4. , 3.75, 3.5 , 3.25, 3. ],
> > [ 5. , 4.75, 4.5 , 4.25, 4.
> ]])
> >
> > David
> > _______________________________________________
> > NumPy-Discussion mailing list
> > NumPy-Discussion@scipy.org
> > http://mail.scipy.org/mailman/listinfo/numpy-discussion
> >
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion@scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>
More information about the NumPy-Discussion
mailing list