Skip to content

How to Resolve Python NumPy "TypeError: ufunc 'isnan' not supported for the input types"

Fix the NumPy TypeError when using np.isnan() on non-numeric arrays by converting to float or using Pandas' isnull()/isna() for mixed-type data.

When working with NumPy arrays, you might encounter the TypeError: ufunc 'isnan' not supported for the input types... This error arises when you attempt to use the numpy.isnan() function on an array whose data type (dtype) is not numeric (specifically, not a floating-point type where NaN - Not a Number - is defined). This commonly happens with arrays containing strings or having an object dtype.

This guide explains why this error occurs and provides effective solutions using either Pandas or by converting the NumPy array's data type.

Understanding the Error: NaN and Numeric Types

NaN (Not a Number) is a special floating-point value defined in the IEEE 754 standard. It represents undefined or unrepresentable results of numeric operations (like 0/0). The numpy.isnan() function is specifically designed to test for this floating-point NaN value within NumPy arrays.

The TypeError occurs because the concept of NaN doesn't directly apply to non-numeric data types like strings ('hello') or generic Python objects. np.isnan() doesn't know how to determine if a string like '5' or 'apple' is "Not a Number" in the floating-point sense.

The Cause: Using np.isnan() on Non-Numeric Arrays

You are passing a NumPy array containing strings, objects, or other non-float types to np.isnan().

import numpy as np

string_array = np.array(['10', '20', 'missing', '30'])
print(f"Array: {string_array}")
print(f"dtype: {string_array.dtype}") # Often '<U...' (Unicode string) or 'object'

try:
    nan_check = np.isnan(string_array)
    print(nan_check)
except TypeError as e:
    print(e)

mixed_array = np.array([10.5, 'valid', None, np.nan, 30])
print(f"\nMixed Array: {mixed_array}")
print(f"dtype: {mixed_array.dtype}") # Often 'object'

try:
    nan_check_mixed = np.isnan(mixed_array)
    print(nan_check_mixed)
except TypeError as e:
    print(e)

In both cases, the array's dtype is incompatible with np.isnan().

If you're dealing with potentially mixed data types or want a function that broadly checks for "missing" values (including None and np.nan), using the Pandas library is an excellent solution.

Installation (if needed)

If you don't have Pandas installed:

pip install pandas

Usage and Explanation

Pandas provides isnull() and isna() (which are aliases of each other) that work correctly on various dtypes, including strings and objects. They identify both np.nan and Python's None as missing.

import numpy as np
import pandas as pd # Requires pandas installation

test_array = np.array(['5', '10', None, '15', np.nan, ''])
print(f"Original array: {test_array}")

missing_mask_pd = pd.isnull(test_array)

print(f"\nMissing mask (pandas): {missing_mask_pd}")
  • pd.isnull() / pd.isna(): These functions check each element for being a "missing" value according to Pandas' definition (None or np.nan). They return a boolean NumPy array of the same shape as the input.
  • This is often the best approach when your array might contain non-numeric data alongside actual missing values represented by None or np.nan.
  • Note: By default, empty strings ('') and np.inf are not treated as missing by Pandas.

Solution 2: Convert NumPy Array to Float Type

If your array should contain numeric data (perhaps represented as strings initially) and you specifically want to check for the floating-point NaN values, you can convert the array's dtype to float before calling np.isnan().

Using .astype(float)

The .astype() method creates a new array with the specified data type.

import numpy as np

original_array = np.array(['5.5', '10', None, '15.0', np.nan])
print(f"Original array: {original_array}")
print(f"Original dtype: {original_array.dtype}")

float_array = original_array.astype(float)

print(f"\nConverted array: {float_array}")
print(f"Converted dtype: {float_array.dtype}") # Output: float64

nan_check = np.isnan(float_array)
print(f"\nIs NaN check: {nan_check}")

Using dtype=float during Creation

You can specify the desired dtype when creating the array if the source data allows it.

import numpy as np

source_data = ['5.5', '10', None, '15.0', np.nan]

float_array_direct = np.array(source_data, dtype=float)

print(f"Created float array: {float_array_direct}")
print(f"Array dtype: {float_array_direct.dtype}") # Output: float64

nan_check_direct = np.isnan(float_array_direct)
print(f"\nIs NaN check: {nan_check_direct}")

Important Note on Conversion Errors

If your original array contains strings that can not be interpreted as numbers (e.g., 'apple'), attempting to convert the array to float using .astype(float) or dtype=float will raise a ValueError.

import numpy as np

invalid_string_array = np.array(['10', 'apple', '30'])

try:
    float_array = invalid_string_array.astype(float)
except ValueError as e:
    print(f"ValueError during conversion: {e}")

Therefore, converting to float is only suitable if you know your non-missing data is numerically representable.

Choosing the Right Method

  • Use Pandas (pd.isnull/pd.isna) if:
    • You already use Pandas in your project.
    • Your array contains genuinely mixed types (strings, numbers, None, NaN) and you want to identify None and NaN as "missing".
    • You don't want to (or cannot reliably) convert the entire array to a numeric type.
  • Convert to Float (then use np.isnan) if:
    • Your data is intended to be numeric, even if currently stored as strings.
    • You specifically need to identify floating-point NaN values (and treat None as NaN).
    • You are confident that non-missing string values can be converted to numbers without raising a ValueError.
    • You prefer to stay within the NumPy library.

Conclusion

The TypeError: ufunc 'isnan' not supported for the input types... occurs because numpy.isnan() requires a NumPy array with a numeric (specifically float-compatible) dtype. It cannot operate directly on arrays containing strings or generic objects.

The primary solutions are:

  1. Use pandas.isnull() or pandas.isna(): These functions robustly handle mixed data types and identify both None and np.nan as missing values. Recommended if using Pandas or dealing with truly mixed-type arrays.
  2. Convert the NumPy array to a float dtype: Use .astype(float) or specify dtype=float during creation. This makes the array compatible with np.isnan() but requires that the original data (if strings) is numerically convertible and will treat None as np.nan.

Choose the solution that best fits the nature of your data and your project's dependencies.

Navigation