Numpy next element minus previous

numpy diff
numpy subtract
numpy append
numpy subtract along axis
numpy setdiff 2d
numpy subtract arrays different shape
subtract 3d array numpy
matrix minus numpy

I would like to subtract the next element from current element in a specific axis from numpy array. But, I know how to do that using a lot of loops. My question is: How to do that in the most efficient way? Maybe using numpy?

My Python code below:

import numpy as np

np.random.seed(0)

myarr = np.random.rand(20, 7, 11, 151, 161)

newarr = np.full((20, 6, 11, 151, 161), np.nan)

for iyr in range(20):
    for iwk in range(6):
        for imb in range(11):
            for ilat in range(151):
                for ilon in range(161):
                     newarr[iyr, iwk, imb, ilat, ilon] = myarr[iyr, iwk + 1, imb, ilat, ilon] - myarr[iyr, iwk, imb, ilat, ilon]

There are a few good ways of doing this. If you did not care about the last element being NaN, you could use np.diff

myarr = np.random.rand(20, 7, 11, 151, 161)
newarr = np.diff(myarr, axis=1)

The result will have shape (20, 6, 11, 151, 161).

If you really want to keep those NaNs, I would recommend using np.empty_like and np.subtract. Allocating with np.full is somewhat wasteful since you are definitely setting almost all the elements. The only NaNs you have are in the last index along the second dimension, which you can initialize very cheaply yourself:

myarr = np.random.rand(20, 7, 11, 151, 161)
newarr = np.empty_like(myarr)  # Don't repeat shape
newarr[:, -1, ...] = np.nan
np.subtract(myarr[:, 1:, ...], myarr[:, :-1, ...], out=newarr[:, :-1, ...])

Since myarr[:, 1:, ...], myarr[:, :-1, ...] and newarr[:, :-1, ...] are views, this operation avoids temporary arrays and unnecessary initialization almost completely.

numpy.subtract — NumPy v1.19 Manual, Subtract arguments, element-wise. Parameters. x1, x2array_like. The arrays to be subtracted from each other. If x1.shape� Previous topic. numpy.power. Next topic. numpy.true_divide. numpy The difference of x1 and x2, element-wise. This is a scalar if both x1 and x2 are scalars.

Numpy version:

myarr = np.random.rand(20, 7, 11, 151, 161)
newarr_np = myarr[:, 1:,] - myarr[:, :-1]

Your edited code:

from itertools import product

newarr = np.full((20, 6, 11, 151, 161), np.nan)

for iyr, iwk, imb, ilat, ilon in product(range(20), range(6), range(11), range(151), range(161)):
    newarr[iyr, iwk, imb, ilat, ilon] = \
        myarr[iyr, iwk + 1, imb, ilat, ilon] - \
        myarr[iyr, iwk    , imb, ilat, ilon]

Equality test

np.all(newarr_np == newarr)
> True

numpy.diff — NumPy v1.19 Manual, The axis along which the difference is taken, default is the last axis. is the same as the type of the difference between any two elements of a. Parameters: x: array_like or scalar. Input array. out: ndarray, None, or tuple of ndarray and None, optional. A location into which the result is stored. If provided, it must have a shape that the inputs broadcast to.

You can use : to select a whole dimension.

for iwk in range(6):
    newarr[:,iwk,:,:,:] = myarr[:,iwk+1,:,:,:] - myarr[:,iwk,:,:,:]

numpy.subtract() in Python, subtract() function is used when we want to compute the difference of two array.It returns the difference of arr1 and arr2, element-wise. Syntax : numpy.subtract( arr1� The difference of x1 and x2, element-wise. Returns a scalar if both x1 and x2 are scalars. Notes. Previous topic. numpy.power. Next topic. numpy.true_divide

Just use array slicing to get a smaller one, add a 0 row/column to that to extend it the same size, and subtract. Like this:

>>> x=np.random.rand(10)
>>> x #this is our original array
array([0.49662379, 0.18424862, 0.43346481, 0.57377969, 0.88027509,
       0.9820584 , 0.63669062, 0.27981557, 0.70115255, 0.47660883])
>>> x[1:] #this is the one we want to subtract, but to do that, you need to pad it with zeros
array([0.18424862, 0.43346481, 0.57377969, 0.88027509, 0.9820584 ,
       0.63669062, 0.27981557, 0.70115255, 0.47660883])
>>> ext=np.zeros(1) # so we take a few zeros
>>> ext
array([0.])
>>> np.concatenate((x[1:],ext)) # pad it
array([0.18424862, 0.43346481, 0.57377969, 0.88027509, 0.9820584 ,
       0.63669062, 0.27981557, 0.70115255, 0.47660883, 0.        ])
>>> x-np.concatenate((x[1:],ext)) # and subtract
array([ 0.31237516, -0.24921618, -0.14031489, -0.3064954 , -0.10178331,
        0.34536778,  0.35687505, -0.42133698,  0.22454372,  0.47660883])

Of course there could be simpler solutions. You can choose different dimensions, but a 10 long 1D array is good to demonstrate this.

numpy.subtract — NumPy v1.13 Manual, This is documentation for an old release of NumPy (version 1.13.0). Read this page Search for this <ufunc 'subtract'>�. Subtract arguments, element-wise. The difference of x1 and x2, element-wise. Returns a scalar if both x1 and x2 are scalars. Notes. Previous topic. numpy.power. Next topic. numpy.true_divide

numpy.subtract — NumPy v1.9 Manual, subtract(x1, x2) array([[ 0., 0., 0.], [ 3., 3., 3.], [ 6., 6., 6.]]) Previous topic. numpy. power. Next topic. numpy.true_divide. Let us now discuss some of the other important arithmetic functions available in NumPy. numpy.reciprocal() This function returns the reciprocal of argument, element-wise. For elements with absolute values larger than 1, the result is always 0 because of the way in which Python handles integer division. For integer 0, an overflow warning is issued.

Subtracting the mean from columns or rows — Functional MRI , We often want to do operations like subtract the mean from the columns or rows of a 2D array. For example, here is a 4 by 3 array: >>> import numpy as np� numpy.subtract() function is used when we want to compute the difference of two array.It returns the difference of arr1 and arr2, element-wise. Syntax : numpy.subtract(arr1, arr2, /, out=None, *, where=True, casting=’same_kind’, order=’K’, dtype=None, subok=True[, signature, extobj], ufunc ‘subtract’)

NumPy Cheat Sheet — Python for Data Science – Dataquest, Download a free NumPy Cheatsheet to help you work with data in Python. Includes importing, exporting np.subtract(arr,2) | Subtract 2 from each array element Previous topic. numpy.exp. Next topic. numpy.exp2. numpy Element-wise exponential minus one: out = exp(x)-1. This is a scalar if x is a scalar. See also. log1p.

Comments
  • You can also use ... to select one run of contiguous dimensions: [:, iwk, ...]