@@ -99,7 +99,7 @@ cpdef bint is_matching_na(object left, object right, bint nan_matches_none=False
99
99
return False
100
100
101
101
102
- cpdef bint checknull(object val):
102
+ cpdef bint checknull(object val, bint inf_as_na = False ):
103
103
"""
104
104
Return boolean describing of the input is NA-like, defined here as any
105
105
of:
@@ -114,19 +114,16 @@ cpdef bint checknull(object val):
114
114
Parameters
115
115
----------
116
116
val : object
117
+ inf_as_na : bool, default False
118
+ Whether to treat INF and -INF as NA values.
117
119
118
120
Returns
119
121
-------
120
122
bool
121
-
122
- Notes
123
- -----
124
- The difference between `checknull` and `checknull_old` is that `checknull`
125
- does *not* consider INF or NEGINF to be NA.
126
123
"""
127
124
return (
128
125
val is C_NA
129
- or is_null_datetimelike(val, inat_is_null = False )
126
+ or is_null_datetimelike(val, inat_is_null = False , inf_as_na = inf_as_na )
130
127
or is_decimal_na(val)
131
128
)
132
129
@@ -139,42 +136,12 @@ cdef inline bint is_decimal_na(object val):
139
136
140
137
141
138
cpdef bint checknull_old(object val):
142
- """
143
- Return boolean describing of the input is NA-like, defined here as any
144
- of:
145
- - None
146
- - nan
147
- - INF
148
- - NEGINF
149
- - NaT
150
- - np.datetime64 representation of NaT
151
- - np.timedelta64 representation of NaT
152
- - NA
153
- - Decimal("NaN")
154
-
155
- Parameters
156
- ----------
157
- val : object
158
-
159
- Returns
160
- -------
161
- result : bool
162
-
163
- Notes
164
- -----
165
- The difference between `checknull` and `checknull_old` is that `checknull`
166
- does *not* consider INF or NEGINF to be NA.
167
- """
168
- if checknull(val):
169
- return True
170
- elif util.is_float_object(val) or util.is_complex_object(val):
171
- return val == INF or val == NEGINF
172
- return False
139
+ return checknull(val, inf_as_na = True )
173
140
174
141
175
142
@ cython.wraparound (False )
176
143
@ cython.boundscheck (False )
177
- cpdef ndarray[uint8_t] isnaobj(ndarray arr):
144
+ cpdef ndarray[uint8_t] isnaobj(ndarray arr, bint inf_as_na = False ):
178
145
"""
179
146
Return boolean mask denoting which elements of a 1-D array are na-like,
180
147
according to the criteria defined in `checknull`:
@@ -205,53 +172,19 @@ cpdef ndarray[uint8_t] isnaobj(ndarray arr):
205
172
result = np.empty(n, dtype = np.uint8)
206
173
for i in range (n):
207
174
val = arr[i]
208
- result[i] = checknull(val)
175
+ result[i] = checknull(val, inf_as_na = inf_as_na )
209
176
return result.view(np.bool_)
210
177
211
178
212
179
@ cython.wraparound (False )
213
180
@ cython.boundscheck (False )
214
181
def isnaobj_old (arr: ndarray ) -> ndarray:
215
- """
216
- Return boolean mask denoting which elements of a 1-D array are na-like ,
217
- defined as being any of:
218
- - None
219
- - nan
220
- - INF
221
- - NEGINF
222
- - NaT
223
- - NA
224
- - Decimal("NaN")
225
-
226
- Parameters
227
- ----------
228
- arr : ndarray
229
-
230
- Returns
231
- -------
232
- result : ndarray (dtype = np.bool_)
233
- """
234
- cdef:
235
- Py_ssize_t i , n
236
- object val
237
- ndarray[uint8_t] result
238
-
239
- assert arr.ndim == 1, "'arr' must be 1-D."
240
-
241
- n = len (arr)
242
- result = np.zeros(n, dtype = np.uint8)
243
- for i in range(n ):
244
- val = arr[i]
245
- result[i] = (
246
- checknull(val)
247
- or util.is_float_object(val) and (val == INF or val == NEGINF)
248
- )
249
- return result.view(np.bool_)
182
+ return isnaobj(arr , inf_as_na = True )
250
183
251
184
252
185
@cython.wraparound(False )
253
186
@cython.boundscheck(False )
254
- def isnaobj2d (arr: ndarray ) -> ndarray:
187
+ def isnaobj2d(arr: ndarray , inf_as_na: bool = False ) -> ndarray:
255
188
"""
256
189
Return boolean mask denoting which elements of a 2-D array are na-like ,
257
190
according to the criteria defined in `checknull`:
@@ -270,11 +203,6 @@ def isnaobj2d(arr: ndarray) -> ndarray:
270
203
Returns
271
204
-------
272
205
result : ndarray (dtype = np.bool_)
273
-
274
- Notes
275
- -----
276
- The difference between `isnaobj2d` and `isnaobj2d_old` is that `isnaobj2d`
277
- does *not* consider INF or NEGINF to be NA.
278
206
"""
279
207
cdef:
280
208
Py_ssize_t i , j , n , m
@@ -288,55 +216,15 @@ def isnaobj2d(arr: ndarray) -> ndarray:
288
216
for i in range(n ):
289
217
for j in range (m):
290
218
val = arr[i, j]
291
- if checknull(val):
219
+ if checknull(val, inf_as_na = inf_as_na ):
292
220
result[i, j] = 1
293
221
return result.view(np.bool_)
294
222
295
223
296
224
@ cython.wraparound (False )
297
225
@ cython.boundscheck (False )
298
226
def isnaobj2d_old (arr: ndarray ) -> ndarray:
299
- """
300
- Return boolean mask denoting which elements of a 2-D array are na-like ,
301
- according to the criteria defined in `checknull_old`:
302
- - None
303
- - nan
304
- - INF
305
- - NEGINF
306
- - NaT
307
- - np.datetime64 representation of NaT
308
- - np.timedelta64 representation of NaT
309
- - NA
310
- - Decimal("NaN")
311
-
312
- Parameters
313
- ----------
314
- arr : ndarray
315
-
316
- Returns
317
- -------
318
- ndarray (dtype = np.bool_)
319
-
320
- Notes
321
- -----
322
- The difference between `isnaobj2d` and `isnaobj2d_old` is that `isnaobj2d`
323
- does *not* consider INF or NEGINF to be NA.
324
- """
325
- cdef:
326
- Py_ssize_t i , j , n , m
327
- object val
328
- ndarray[uint8_t , ndim = 2 ] result
329
-
330
- assert arr.ndim == 2, "'arr' must be 2-D."
331
-
332
- n , m = (< object > arr).shape
333
- result = np.zeros((n, m), dtype = np.uint8)
334
- for i in range(n ):
335
- for j in range (m):
336
- val = arr[i, j]
337
- if checknull_old(val):
338
- result[i, j] = 1
339
- return result.view(np.bool_)
227
+ return isnaobj2d(arr , inf_as_na = True )
340
228
341
229
342
230
def isposinf_scalar(val: object ) -> bool:
0 commit comments