Reputation: 2467
I wrote a python script below:
import numpy as np
arr = np.arange(6).reshape(2, 3)
arr[arr==0]=['nan']
print arr
But I got this error:
Traceback (most recent call last):
File "C:\Users\Desktop\test.py", line 4, in <module>
arr[arr==0]=['nan']
ValueError: invalid literal for long() with base 10: 'nan'
[Finished in 0.2s with exit code 1]
How to replace zeros in a NumPy array with nan?
Upvotes: 38
Views: 110987
Reputation: 23381
An integer array can't hold a NaN value, so a new copy will have to be created anyway; so numpy.where
may be used here to replace the values that satisfy the condition by NaN:
arr = np.arange(6).reshape(2, 3)
arr = np.where(arr==0, np.nan, arr)
# array([[nan, 1., 2.],
# [ 3., 4., 5.]])
Upvotes: 1
Reputation: 177018
np.nan
has type float
: arrays containing it must also have this datatype (or the complex
or object
datatype) so you may need to cast arr
before you try to assign this value.
The error arises because the string value 'nan'
can't be converted to an integer type to match arr
's type.
>>> arr = arr.astype('float')
>>> arr[arr == 0] = 'nan' # or use np.nan
>>> arr
array([[ nan, 1., 2.],
[ 3., 4., 5.]])
Upvotes: 59