Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Shift "nan" to the beginning of an array in python [duplicate]

If I have an array with nan, which looks like this:

array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0., nan, nan],
       [ 0.,  1.,  3., nan],
       [ 0.,  2.,  4.,  7.],
       [ 0., nan,  2., nan],
       [ 0.,  4., nan, nan]])

how can I shift all the nans to the start of the array, without changing the shape? Some thing like this:

array([[ 0.,  0.,  0.,  0.],
       [ nan, nan, 0.,  0.],
       [ nan, 0.,  1.,  3.],
       [ 0.,  2.,  4.,  7.],
       [ nan, nan, 0.,  2.],
       [ nan, nan, 0.,  4.]])
like image 943
Freddie Avatar asked Jul 22 '20 09:07

Freddie


People also ask

How do you shift a Numpy array?

To shift the bits of integer array elements to the right, use the numpy. right_shift() method in Python Numpy. Bits are shifted to the right x2. Because the internal representation of numbers is in binary format, this operation is equivalent to dividing x1 by 2**x2.

What causes NaN in Python?

Nan means “Not a number”, this is because inside your cube function, you're not calling the square function, but getting it's contents. Change return x * square; with return x * square(x); and it should work.

How to shift a NumPy array in Python?

This tutorial will introduce methods to shift a NumPy array. If we want to right-shift or left-shift the elements of a NumPy array, we can use the numpy.roll () method in Python. The numpy.roll () method is used to roll array elements along a specified axis.

How to create Nan array in Python NumPy?

Python numpy create nan array. In this section, we will discuss Python numpy create nan array. To create an array with nan values we have to use numpy.empty() and fill() function. It retruns a full array with the same shape and type as a given array. Use numpy. empty((x,y)) to create an uninitialized array with x rows and y columns.

How do I find the NaN value in Python?

Python numpy nan compare To check for NaN values in a Python Numpy array you can use the np.isnan () method. NaN stands for Not a Number. NaN is used to representing entries that are undefined. It is also used for representing missing NAN values in a given array.

How to shift an array along a specified axis in Python?

The numpy.roll () method is used to roll array elements along a specified axis. It takes the array and the number of places we want to shift the elements of the array and returns the shifted array. If we want to shift the elements towards the right, we have to use a positive integer as the shift value.


1 Answers

Here's one way:

# find the position of nan itms in "a"
In [19]: mask = np.isnan(a)                                                                                                                                                                                 
# put them at the beginning by sorting the mask in a descending order
In [20]: nan_pos = np.sort(mask)[:,::-1]                                                                                                                                                                    
# the new position of non_non items is the inverse of non-mask sorted ascending 
In [21]: not_nan_pos = np.sort(~mask)                                                                                                                                                                       

In [22]: emp = np.empty(a.shape)                                                                                                                                                                            

In [23]: emp[nan_pos] = np.nan                                                                                                                                                                              

In [24]: emp[not_nan_pos] = a[~mask]                                                                                                                                                                        

In [25]: emp                                                                                                                                                                                                
Out[25]: 
array([[ 0.,  0.,  0.,  0.],
       [nan, nan,  0.,  0.],
       [nan,  0.,  1.,  3.],
       [ 0.,  2.,  4.,  7.],
       [nan, nan,  0.,  2.],
       [nan, nan,  0.,  4.]])
like image 84
Mazdak Avatar answered Oct 19 '22 18:10

Mazdak