Equivalent to arr1d[~arr1d.isnan()], but in a different order Presumably faster as it incurs fewer copies Parameters ---------- arr1d : ndarray Array to remove nans from second_arr1d : ndarray or None A second array which will have the same positions remove
(arr1d, second_arr1d=None, overwrite_input=False)
| 142 | |
| 143 | |
| 144 | def _remove_nan_1d(arr1d, second_arr1d=None, overwrite_input=False): |
| 145 | """ |
| 146 | Equivalent to arr1d[~arr1d.isnan()], but in a different order |
| 147 | |
| 148 | Presumably faster as it incurs fewer copies |
| 149 | |
| 150 | Parameters |
| 151 | ---------- |
| 152 | arr1d : ndarray |
| 153 | Array to remove nans from |
| 154 | second_arr1d : ndarray or None |
| 155 | A second array which will have the same positions removed as arr1d. |
| 156 | overwrite_input : bool |
| 157 | True if `arr1d` can be modified in place |
| 158 | |
| 159 | Returns |
| 160 | ------- |
| 161 | res : ndarray |
| 162 | Array with nan elements removed |
| 163 | second_res : ndarray or None |
| 164 | Second array with nan element positions of first array removed. |
| 165 | overwrite_input : bool |
| 166 | True if `res` can be modified in place, given the constraint on the |
| 167 | input |
| 168 | """ |
| 169 | if arr1d.dtype == object: |
| 170 | # object arrays do not support `isnan` (gh-9009), so make a guess |
| 171 | c = np.not_equal(arr1d, arr1d, dtype=bool) |
| 172 | else: |
| 173 | c = np.isnan(arr1d) |
| 174 | |
| 175 | s = np.nonzero(c)[0] |
| 176 | if s.size == arr1d.size: |
| 177 | warnings.warn("All-NaN slice encountered", RuntimeWarning, |
| 178 | stacklevel=6) |
| 179 | if second_arr1d is None: |
| 180 | return arr1d[:0], None, True |
| 181 | else: |
| 182 | return arr1d[:0], second_arr1d[:0], True |
| 183 | elif s.size == 0: |
| 184 | return arr1d, second_arr1d, overwrite_input |
| 185 | else: |
| 186 | if not overwrite_input: |
| 187 | arr1d = arr1d.copy() |
| 188 | # select non-nans at end of array |
| 189 | enonan = arr1d[-s.size:][~c[-s.size:]] |
| 190 | # fill nans in beginning of array with non-nans of end |
| 191 | arr1d[s[:enonan.size]] = enonan |
| 192 | |
| 193 | if second_arr1d is None: |
| 194 | return arr1d[:-s.size], None, True |
| 195 | else: |
| 196 | if not overwrite_input: |
| 197 | second_arr1d = second_arr1d.copy() |
| 198 | enonan = second_arr1d[-s.size:][~c[-s.size:]] |
| 199 | second_arr1d[s[:enonan.size]] = enonan |
| 200 | |
| 201 | return arr1d[:-s.size], second_arr1d[:-s.size], True |
no test coverage detected
searching dependent graphs…