Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Vectorized NumPy linspace across multi-dimensional arrays

Say I have 2 numpy 2D arrays, mins, and maxs, that will always be the same dimension as one another. I'd like to create a third array, results, that is the result of applying linspace to max and min value. Is there some "numpy"/vectorized way to do this? Example non-vectorized code is below to show results I would like.

import numpy as np

mins = np.random.rand(2,2)
maxs = np.random.rand(2,2)

# Number of elements in the linspace
x = 3

m, n = mins.shape
results = np.zeros((m, n, x))

for i in range(m):
    for j in range(n):
        min = mins[i][j]
        max = maxs[i][j]
        results[i][j] = np.linspace(min, max, num=x)
like image 232
holtc Avatar asked Oct 11 '17 17:10

holtc


People also ask

What does the NumPy Linspace () function do?

The NumPy linspace function creates sequences of evenly spaced values within a defined interval. What is this? Essentally, you specify a starting point and an ending point of an interval, and then specify the total number of breakpoints you want within that interval (including the start and end points).

Does NumPy support multidimensional arrays Ndarray?

NumPy is a library in python adding support for large multidimensional arrays and matrices along with high level mathematical functions to operate these arrays.

Does NumPy have Linspace?

linspace is an in-built function in Python's NumPy library. It is used to create an evenly spaced sequence in a specified interval.

Can NumPy arrays have more than 2 dimensions?

numpy arrays can have 0, 1, 2 or more dimensions. C. shape returns a tuple of the dimensions; it may be of 0 length, () , 1 value, (81,) , or 2 (81,1) .


1 Answers

Here's one vectorized approach based on this post to cover for generic n-dim cases -

def create_ranges_nd(start, stop, N, endpoint=True):
    if endpoint==1:
        divisor = N-1
    else:
        divisor = N
    steps = (1.0/divisor) * (stop - start)
    return start[...,None] + steps[...,None]*np.arange(N)

Sample run -

In [536]: mins = np.array([[3,5],[2,4]])

In [537]: maxs = np.array([[13,16],[11,12]])

In [538]: create_ranges_nd(mins, maxs, 6)
Out[538]: 
array([[[  3. ,   5. ,   7. ,   9. ,  11. ,  13. ],
        [  5. ,   7.2,   9.4,  11.6,  13.8,  16. ]],

       [[  2. ,   3.8,   5.6,   7.4,   9.2,  11. ],
        [  4. ,   5.6,   7.2,   8.8,  10.4,  12. ]]])
like image 74
Divakar Avatar answered Nov 10 '22 15:11

Divakar