Replace NaN with 0 in 2D NumPy Array

What is the best way to Python replace NaN with 0 in a 2D numpy array, so that I can perform operations like sorting and averaging without running into issues?

For example, consider the following 2D numpy array:

[[   0.   43.   67.    0.   38.]
 [ 100.   86.   96.  100.   94.]
 [  76.   79.   83.   89.   56.]
 [  88.   NaN   67.   89.   81.]
 [  94.   79.   67.   89.   69.]
 [  88.   79.   58.   72.   63.]
 [  76.   79.   71.   67.   56.]
 [  71.   71.   NaN   56.  100.]]

I want to process each row, sort it in reverse order, take the top 3 values, and calculate their average. However, this approach doesn’t work for rows containing NaN values. How can I quickly Python replace NaN with 0 in the 2D numpy array so that I can avoid issues when performing the sorting and averaging operations?

I’ve worked with large numpy arrays for a while, and when I need a quick and efficient fix, I go with numpy.isnan(). It directly modifies the array, so no unnecessary copies are made.

import numpy as np

a = np.array([[1, 2, 3], [0, 3, np.nan]])
a[np.isnan(a)] = 0  # Replace NaN with 0

print(a)

:white_check_mark: Why use this?

  • It’s the most memory-efficient way to python replace NaN with 0, as it works directly on the original array.
  • Ideal when working with large datasets where performance matters.

If you don’t want to modify the original array and prefer creating a new one, numpy.nan_to_num() is your best friend. It replaces NaN with 0 but also lets you handle infinities if needed.

import numpy as np

a = np.array([[1, 2, 3], [0, 3, np.nan]])
a_clean = np.nan_to_num(a, copy=True)  # Replace NaN with 0, keep the original intact

print(a_clean)

:white_check_mark: Why use this?

  • Preserves the original data for comparison.
  • Also replaces infinities (inf and -inf), which might be useful in certain datasets.

If you’re working in data science or ML, this is often the safer choice to prevent accidental data modification.

Here’s another cool trick: numpy.where(). It lets you replace NaN with 0 while also allowing for more complex transformations later.

import numpy as np

a = np.array([[1, 2, 3], [0, 3, np.nan]])
a_transformed = np.where(np.isnan(a), 0, a)  # Replace NaN with 0

print(a_transformed)

:white_check_mark: Why use this?

  • Useful when you’re performing conditional replacements.
  • You can tweak it easily, like replacing NaNs with the column mean instead of 0.