Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to interpret numpy.gradient?

Tags:

numpy

In the first example of the documentation http://docs.scipy.org/doc/numpy/reference/generated/numpy.gradient.html

x = np.array([1, 2, 4, 7, 11, 16], dtype=np.float)
np.gradient(x)
array([ 1. ,  1.5,  2.5,  3.5,  4.5,  5. ])

Isn't the output should be:

array([ 1. ,  1.,  2.,  3.,  4.,  5. ])

???

like image 943
Ka-Wa Yip Avatar asked Aug 26 '26 13:08

Ka-Wa Yip


2 Answers

Numpy-gradient uses forward, backward, and central differences where appropriate.

Input:

x = np.array([1, 2, 4, 7, 11, 16], dtype=np.float)
np.gradient(x)      # this uses default distance=1

Output:

array([ 1. , 1.5, 2.5, 3.5, 4.5, 5. ])


For the first item it uses forward (current -> next) difference:
- previous number: none
- current (first) number: 1
- next number: 2
(2 - 1) / 1 = 1.

For the last item it uses backward (previous -> current) difference:
- previous number: 11
- current (last) number: 16
- next number: none
(16 - 11) / 1 = 5.

And, for the items in between, the central difference is applied:
- previous number: 1
- current number: 2
- next number: 4
(4 - 1) / 2 = 1.5

- previous number: 2
- current number: 4
- next number: 7
(7 - 2) / 2 = 2.5
...
and so on:-
(11 - 4) / 2 = 3.5
(16 - 7) / 2 = 4.5

The differences are divided by the sample distance (default=1) for forward and backward differences, but twice the distance for the central difference to obtain appropriate gradients.

like image 197
swatchai Avatar answered Aug 28 '26 09:08

swatchai


What you expect as output is what you will get when running np.diff, but then one element shorter:

np.diff(arr)
>>> array([ 1.,  2.,  3.,  4.,  5.])

np.gradient looks takes the i'th element and looks at the average between the differences for the (i+1)'th vs. i'th element and the (i-1)'th vs. i'th element. For the edge values it only can use one point. So value number two comes 1.5 comes from averaging (2-1) and (4-2).

like image 26
oschoudhury Avatar answered Aug 28 '26 08:08

oschoudhury



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!