How To Handle nan In Numpy

In this article, I will show you how to handle nans in Numpy.

Now lets import the necessary packages.

In [58]:
import pandas as pd
import numpy as np

Lets create some dummy data for this example.

In [34]:
a=np.array([1,np.nan,np.nan,np.nan,3,4,5,6,7,8,9])
In [36]:
a
Out[36]:
array([ 1., nan, nan, nan,  3.,  4.,  5.,  6.,  7.,  8.,  9.])
In [37]:
type(a)
Out[37]:
numpy.ndarray

Numpy calculate mean with nanvalues

Lets check the mean first.

In [38]:
a.mean()
Out[38]:
nan

We got nan which is not correct. We need to exclude the nans before calculating the mean. Numpy has nanmean which does the mean for only non nan values.

In [43]:
a.nanmean()

You would run into following error.

AttributeError: 'numpy.ndarray' object has no attribute 'nanmean'. Correct way is to pass numpy array to nanmean function.

In [42]:
np.nanmean(a)
Out[42]:
5.375

How to handle product of two vectors having nan values in Numpy

Lets create another numpy vector of same dimensions as a.

In [44]:
b=np.array([11,np.nan,np.nan,np.nan,12,13,14,15,16,17,18])

Lets do product of two vectors a and b.

In [47]:
c = np.outer(a,b)
In [54]:
c.shape
Out[54]:
(11, 11)

Covriance between two vectors with nan values in Numpy

Lets see what is the covariance between array a and b.

In [55]:
np.cov([a,b])
Out[55]:
array([[nan, nan],
       [nan, nan]])

To resolve the above situation we will have to use numpy masks. Masks are used to mask the values which need not to be used in computation.

Lets first import the package numpy masks.

In [60]:
import numpy.ma as ma

To masks nan , we can use ma.masked_invalid. Lets apply this method on array a and b.

In [64]:
ma.masked_invalid(a)
Out[64]:
masked_array(data=[1.0, --, --, --, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0],
             mask=[False,  True,  True,  True, False, False, False, False,
                   False, False, False],
       fill_value=1e+20)
In [65]:
ma.masked_invalid(b)
Out[65]:
masked_array(data=[11.0, --, --, --, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0,
                   18.0],
             mask=[False,  True,  True,  True, False, False, False, False,
                   False, False, False],
       fill_value=1e+20)

As we can see, all nan values are masked as False.

Ok we are good to go now. To calculate variance, numpy mask has variance function as shown below.

In [73]:
ma.cov(ma.masked_invalid(np.outer(a,b)),rowvar=False)
Out[73]:
masked_array(
  data=[[862.125, --, --, --, 940.5, 1018.875, 1097.25, 1175.625, 1254.0,
         1332.375, 1410.75],
        [--, --, --, --, --, --, --, --, --, --, --],
        [--, --, --, --, --, --, --, --, --, --, --],
        [--, --, --, --, --, --, --, --, --, --, --],
        [940.5, --, --, --, 1026.0, 1111.5, 1197.0, 1282.5, 1368.0,
         1453.5, 1539.0],
        [1018.875, --, --, --, 1111.5, 1204.125, 1296.75, 1389.375,
         1482.0, 1574.625, 1667.25],
        [1097.25, --, --, --, 1197.0, 1296.75, 1396.5, 1496.25, 1596.0,
         1695.75, 1795.5],
        [1175.625, --, --, --, 1282.5, 1389.375, 1496.25, 1603.125,
         1710.0, 1816.875, 1923.75],
        [1254.0, --, --, --, 1368.0, 1482.0, 1596.0, 1710.0, 1824.0,
         1938.0, 2052.0],
        [1332.375, --, --, --, 1453.5, 1574.625, 1695.75, 1816.875,
         1938.0, 2059.125, 2180.25],
        [1410.75, --, --, --, 1539.0, 1667.25, 1795.5, 1923.75, 2052.0,
         2180.25, 2308.5]],
  mask=[[False,  True,  True,  True, False, False, False, False, False,
         False, False],
        [ True,  True,  True,  True,  True,  True,  True,  True,  True,
          True,  True],
        [ True,  True,  True,  True,  True,  True,  True,  True,  True,
          True,  True],
        [ True,  True,  True,  True,  True,  True,  True,  True,  True,
          True,  True],
        [False,  True,  True,  True, False, False, False, False, False,
         False, False],
        [False,  True,  True,  True, False, False, False, False, False,
         False, False],
        [False,  True,  True,  True, False, False, False, False, False,
         False, False],
        [False,  True,  True,  True, False, False, False, False, False,
         False, False],
        [False,  True,  True,  True, False, False, False, False, False,
         False, False],
        [False,  True,  True,  True, False, False, False, False, False,
         False, False],
        [False,  True,  True,  True, False, False, False, False, False,
         False, False]],
  fill_value=1e+20)

Wrap Up!

Thats it for now. I would add more examples to this post in next few days.

Related Topics: