146 |
| - Get the converter for data that has the same type as *x*. If no | 147 |
| - converters are registered for *x*, returns ``None``. |
148 |
| - """ |
149 |
| - |
150 |
| - if not len(self): |
151 |
| - return None # nothing registered |
152 |
| - # DISABLED idx = id(x) |
153 |
| - # DISABLED cached = self._cached.get(idx) |
154 |
| - # DISABLED if cached is not None: return cached |
155 |
| - |
156 |
| - converter = None |
157 |
| - classx = getattr(x, '__class__', None) |
158 |
| - |
159 |
| - if classx is not None: |
160 |
| - converter = self.get(classx) |
161 |
| - |
162 |
| - if converter is None and hasattr(x, "values"): |
163 |
| - # this unpacks pandas series or dataframes... |
164 |
| - x = x.values |
165 |
| - |
166 |
| - # If x is an array, look inside the array for data with units |
| 140 | + """Get the converter interface instance for *x*, or None."
8000
;"" |
167 | 141 | if isinstance(x, np.ndarray):
|
168 |
| - # If there are no elements in x, infer the units from its dtype |
169 |
| - if not x.size: |
170 |
| - return self.get_converter(np.array([0], dtype=x.dtype)) |
171 |
| - xravel = x.ravel() |
| 142 | + # In case x in a masked array, access the underlying data (only its |
| 143 | + # type matters). If x is a regular ndarray, getdata() just returns |
| 144 | + # the array itself. |
| 145 | + x = np.ma.getdata(x).ravel() |
| 146 | + try: |
| 147 | + return self[type(x)] |
| 148 | + except KeyError: |
172 | 149 | try:
|
173 |
| - # pass the first value of x that is not masked back to |
174 |
| - # get_converter |
175 |
| - if not np.all(xravel.mask): |
176 |
| - # Get first non-masked item |
177 |
| - converter = self.get_converter( |
178 |
| - xravel[np.argmin(xravel.mask)]) |
179 |
| - return converter |
180 |
| - except AttributeError: |
181 |
| - # not a masked_array |
182 |
| - # Make sure we don't recurse forever -- it's possible for |
183 |
| - # ndarray subclasses to continue to return subclasses and |
184 |
| - # not ever return a non-subclass for a single element. |
185 |
| - next_item = xravel[0] |
186 |
| - if (not isinstance(next_item, np.ndarray) or |
187 |
| - next_item.shape != x.shape): |
188 |
| - converter = self.get_converter(next_item) |
189 |
| - return converter |
190 |
| - |
191 |
| - # If we haven't found a converter yet, try to get the first element |
192 |
| - if converter is None: |
193 |
| - try: |
194 |
| - thisx = cbook.safe_first_element(x) |
| 150 | + first = cbook.safe_first_element(x) |
195 | 151 | except (TypeError, StopIteration):
|
196 | 152 | pass
|
197 | 153 | else:
|
198 |
| - if classx and classx != getattr(thisx, '__class__', None): |
199 |
| - converter = self.get_converter(thisx) |
200 |
| - return converter |
201 |
| - |
202 |
| - # DISABLED self._cached[idx] = converter |
203 |
| - return converter |
| 154 | + # Avoid infinite recursion for pathological iterables for which |
| 155 | + # indexing returns instances of the same iterable class. |
| 156 | + if type(first) is not type(x): |
| 157 | + return self.get_converter(first) |
| 158 | + return None |
204 | 159 |
|
205 | 160 |
|
206 | 161 | registry = Registry()
|
0 commit comments