home / github / issue_comments

Menu
  • Search all tables
  • GraphQL API

issue_comments: 1110681951

This data as json

html_url issue_url id node_id user created_at updated_at author_association body reactions performed_via_github_app issue
https://github.com/pydata/xarray/issues/6517#issuecomment-1110681951 https://api.github.com/repos/pydata/xarray/issues/6517 1110681951 IC_kwDOAMm_X85CM6lf 16100116 2022-04-27T08:04:45Z 2022-04-27T08:22:28Z NONE

Would we take this as a PR? Is there a simpler way to express that logic?

One small simplification I realized later is that slice(None) can be used in place of slice(None, None, None). The isinstance(i, slice) and condition seemed necessary to avoid some case where i was array-like and thus gave an array of booleans with the comparison operator.

The len(key) == len(array.shape) + 1 and key[-1] is ... is to handle the case where (at least) NumpyIndexingAdapter._indexing_array_and_key() appends an extra Ellipsis at the end of a tuple that may already have one slice per array dimension. This is actually the only case I noticed in the debugging, and a test now shows that I get the desired outcome even if the len(key) == len(array.shape) alternative is skipped (although that would look intuitive to allow). Thus an alternative patch could be

```diff --git "indexing.original.py" "indexing.patched.py" --- "indexing.original.py" +++ "indexing.patched.py" @@ -709,9 +709,12 @@ def explicit_indexing_adapter( """ raw_key, numpy_indices = decompose_indexer(key, shape, indexing_support) result = raw_indexing_method(raw_key.tuple) - if numpy_indices.tuple: - # index the loaded np.ndarray - result = NumpyIndexingAdapter(np.asarray(result))[numpy_indices] + if numpy_indices.tuple and (not isinstance(result, np.ndarray) + or not all(i == slice(None) for i in numpy_indices.tuple)): + # The conditions within parentehses are to avoid unnecessary array slice/view-creation + # that would set flags['OWNDATA'] to False for no reason. + # Index the loaded np.ndarray. + result = NumpyIndexingAdapter(np.asarray(result))[numpy_indices] return result

@@ -1156,6 +1160,11 @@ class NumpyIndexingAdapter(ExplicitlyIndexedNDArrayMixin):

 def __getitem__(self, key):
     array, key = self._indexing_array_and_key(key)
  • if (len(key) == len(array.shape) + 1 and key[-1] is ...
  • and all(isinstance(i, slice) and i == slice(None) for i in key[:len(array.shape)])
  • and isinstance(array, np.ndarray)): # (This isinstance-check is because nputils.NumpyVIndexAdapter() has not been tested.)
  • Avoid unnecessary array slice/view-creation that would set flags['OWNDATA'] to False for no reason.

  • return array return array[key]

    def setitem(self, key, value): `` Here I also corrected the fact that my old diff was made against an "original" file missing the line# index the loaded np.ndarray`.

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
  1216517115
Powered by Datasette · Queries took 0.796ms · About: xarray-datasette