I have a 2D array (it is actually very large and a view of another array):
x = np.array([[0, 1, 2],
          [1, 2, 3],
          [2, 3, 4],
          [3, 4, 5]]
        )
And I have a function that processes each row of the array:
def some_func(a):
    """
    Some function that does something funky with a row of numbers
    """
    return [a[2], a[0]]  # This is not so funky
np.apply_along_axis(some_func, 1, x)
What I'm looking for is some way to call the np.apply_along_axis function so that I have access to the row index (for the row being processed) and then be able to process each row with this function:
def some_func(a, idx):
    """
    I plan to use the index for some logic on which columns to
    return. This is only an example
    """
    return [idx, a[2], a[0]]  # This is not so funky
                For a 2d array with axis=1, apply_along_axis is the same as iteration of the rows of the array
In [149]: np.apply_along_axis(some_func, 1, x)
Out[149]: 
array([[2, 0],
       [3, 1],
       [4, 2],
       [5, 3]])
In [151]: np.array([some_func(i) for i in x])
Out[151]: 
array([[2, 0],
       [3, 1],
       [4, 2],
       [5, 3]])
For axis=0 we could iterate on x.T. apply_along_axis is more useful when the array is 3d, and we want to iterate on all dimensions except one.  Then it saves on some tedium.  But it isn't a speed solution.
With your revised function, we can use standard enumerate to get both row and index:
In [153]: np.array([some_func(v,i) for i,v in enumerate(x)])
Out[153]: 
array([[0, 2, 0],
       [1, 3, 1],
       [2, 4, 2],
       [3, 5, 3]])
or with a simple range iteration:
In [157]: np.array([some_func(x[i],i) for i in range(x.shape[0])])
Out[157]: 
array([[0, 2, 0],
       [1, 3, 1],
       [2, 4, 2],
       [3, 5, 3]])
There are various tools for getting the indexing for higher dimenions, things like ndenumerate and ndindex.
The fast solution - work on all rows at once:
In [158]: np.column_stack((np.arange(4), x[:,2], x[:,0]))
Out[158]: 
array([[0, 2, 0],
       [1, 3, 1],
       [2, 4, 2],
       [3, 5, 3]])
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With