[Numpy-discussion] Optimize removing nan-values of dataset

Thomas Goebel Thomas.Goebel@th-nuernberg...
Tue Aug 13 01:50:46 CDT 2013


Hi,

i am trying to remove nan-values from an array of shape(40, 6).
These nan-values at point data[x] should be replaced by the mean
of data[x-1] and data[x+1] if both values at x-1 and x+1 are not
nan. The function nan_to_mean (see below) is working but i wonder
if i could optimize the code.

I thought about something like
  1. Find all nan values in array:
     nans = np.isnan(dataarray)
  2. Check if values before, after nan indice are not nan
  3. Calculate mean

While using this script for my original dataset of
shape(63856, 6) it takes 139.343 seconds to run it. And some
datasets are even bigger. I attached the example_dataset.txt and
the example.py script.

Thanks for any help,
Tom

def nan_to_mean(arr):
    for cnt, value in enumerate(arr):
        # Check if first value is nan, if so continue
        if cnt == 0 and np.isnan(value):
            continue
        # Check if last value is nan:
        #     If x-1 value is nan dont do anything!
        #     If x-1 is float, last value will be value of x-1
        elif cnt == (len(arr)-1):
            if np.isnan(value) and not np.isnan(arr[cnt-1]):
                arr[cnt] = arr[cnt-1]
        # If the first values of file are nan ignore them all
        elif np.isnan(value) and np.isnan(arr[cnt-1]):
            continue
        # Found nan value and x-1 value is of type float
        elif np.isnan(value) and not np.isnan(arr[cnt-1]):
            # Check if x+1 value is not nan
            if not np.isnan(arr[cnt+1]):
                arr[cnt] = '%.1f' % np.mean((
                        arr[cnt-1],arr[cnt+1]))
            # If x+1 value is nan, go to next value
            else:
                for N in xrange(2, 30):
                    if cnt+N == (len(arr)):
                        break
                    elif not np.isnan(arr[cnt+N]):
                        arr[cnt] = '%.1f' % np.mean(
                                (arr[cnt-1], arr[cnt+N]))
    return arr
-------------- next part --------------
16.04.2013;18:09:13;nan;nan;nan;nan;nan;nan
16.04.2013;18:09:18;nan;nan;nan;nan;nan;nan
16.04.2013;18:09:23;nan;nan;nan;nan;nan;nan
16.04.2013;18:09:28;nan;nan;nan;nan;nan;nan
16.04.2013;18:09:33;nan;nan;nan;nan;nan;nan
16.04.2013;18:09:38;nan;nan;nan;nan;nan;nan
16.04.2013;18:09:43;23.9;38.4;nan;nan;nan;nan
16.04.2013;18:09:48;23.9;38.7;nan;nan;nan;nan
16.04.2013;18:09:53;23.9;38.8;23.9;38.3;nan;nan
16.04.2013;18:09:58;23.9;38.8;23.9;38.3;nan;nan
16.04.2013;18:10:03;nan;nan;nan;nan;24.7;37
16.04.2013;18:10:08;24.1;38.6;23.9;38.2;nan;nan
16.04.2013;18:10:13;nan;nan;23.9;38.3;24.6;37.3
16.04.2013;18:10:18;24.1;38.6;23.9;38.3;24.6;37.3
16.04.2013;18:10:23;24.1;38.3;23.9;38.4;24.5;37
16.04.2013;18:10:28;24.2;38.6;23.9;38.1;nan;nan
16.04.2013;18:10:33;24.2;38.6;23.8;38.2;24.5;37.3
16.04.2013;18:10:38;nan;nan;23.8;38.2;nan;nan
16.04.2013;18:10:43;24.2;38.5;23.8;38.1;24.4;37.9
16.04.2013;18:10:48;24.2;38.4;23.8;38.1;24.4;37.5
16.04.2013;18:10:53;24.3;38.3;nan;nan;nan;nan
16.04.2013;18:10:58;nan;nan;23.9;38.1;24.3;37.6
16.04.2013;18:11:03;24.4;38.2;23.9;38.2;24.4;37.6
16.04.2013;18:11:08;24.4;38.2;23.9;38.5;24.3;38.2
16.04.2013;18:11:13;24.4;38.2;23.9;38.8;24.3;38.3
16.04.2013;18:11:18;24.4;39.1;23.9;39;24.3;38.4
16.04.2013;18:11:23;24.4;39.8;23.9;38.5;24.2;38.4
16.04.2013;18:11:28;24.4;41.8;nan;nan;24.1;38.5
16.04.2013;18:12:13;24.6;34.5;nan;nan;23.4;37.2
16.04.2013;18:12:18;24.6;34.4;23.4;36.5;nan;nan
16.04.2013;18:12:23;24.6;34.6;23.3;36.6;nan;nan
16.04.2013;18:12:28;nan;nan;23.2;36.6;23.2;37.4
16.04.2013;18:12:33;nan;nan;23.2;36.9;nan;nan
16.04.2013;18:12:38;nan;nan;nan;nan;23.1;37.8
16.04.2013;18:12:43;24.6;35.1;nan;nan;23.1;37.9
16.04.2013;18:12:48;24.6;35.1;23;37.4;nan;nan
16.04.2013;18:12:53;nan;nan;23;38;nan;nan
16.04.2013;18:12:58;nan;nan;nan;nan;23;37.9
16.04.2013;18:13:03;nan;nan;23;37.9;23;37.7
16.04.2013;18:13:08;nan;nan;23;37.7;23;37.8
-------------- next part --------------
A non-text attachment was scrubbed...
Name: example.py
Type: text/x-python
Size: 1590 bytes
Desc: not available
Url : http://mail.scipy.org/pipermail/numpy-discussion/attachments/20130813/dce44e61/attachment-0001.py 


More information about the NumPy-Discussion mailing list