On Tue, Jul 13, 2010 at 9:54 AM, John Reid <j.r...@mail.cryst.bbk.ac.uk> wrote: > Hi, > > I have some arrays of various shapes in which I need to set any NaNs to > 0. I have been doing the following: > > a[numpy.where(numpy.isnan(a)] = 0. > > as you can see here: > > In [20]: a=numpy.ones(2) > > In [21]: a[1]=numpy.log(-1) > > In [22]: a > Out[22]: array([ 1., NaN]) > > In [23]: a[numpy.where(numpy.isnan(a))]=0. > > In [24]: a > Out[24]: array([ 1., 0.]) > > Unfortunately, I've just discovered that when a.shape == () this doesn't > work at all. For example: > > In [41]: a=numpy.array((1.)) > > In [42]: a.shape > Out[42]: () > > In [43]: a[numpy.where(numpy.isnan(a))]=0. > > In [44]: a > Out[44]: array(0.0)
No need to use where. You can just do a[np.isnan(a)] = 0. But you do have to watch out for 0d arrays, can't index into those. How about: >> def nan_replace(a, fill=0): ....: a = a.copy() ....: if a.ndim == 0: ....: return a ....: a[np.isnan(a)] = fill ....: return a ....: >> >> a = np.array(9) >> nan_replace(a, 0) array(9) >> a = np.array([9, np.nan]) >> nan_replace(a, 0) array([ 9., 0.]) Oh, I guess a[np.isnan(a)] = fill makes a copy so the a.copy() can be moved inside the if statement. _______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion