Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Assignment with vectorized indexing doesn't work with a scalar right-hand-side #1744

Closed
shoyer opened this issue Nov 28, 2017 · 2 comments
Closed

Comments

@shoyer
Copy link
Member

shoyer commented Nov 28, 2017

Building on the example from #1743, I tried a version only using xarray.Variable objects on the left-hand-side. To my surprise, this still doesn't work:

In [8]: xarr.variable[l_indices.variable, c_indices.variable] = 2
---------------------------------------------------------------------------
AxisError                                 Traceback (most recent call last)
<ipython-input-8-75558576dcaf> in <module>()
----> 1 xarr.variable[l_indices.variable, c_indices.variable] = 2

~/dev/xarray/xarray/core/variable.py in __setitem__(self, key, value)
    653             value = np.moveaxis(value, new_order, range(len(new_order)))
    654
--> 655         self._indexable_data[index_tuple] = value
    656
    657     @property

~/dev/xarray/xarray/core/indexing.py in __setitem__(self, key, value)
    660     def __setitem__(self, key, value):
    661         array, key = self._indexing_array_and_key(key)
--> 662         array[key] = value
    663
    664

~/dev/xarray/xarray/core/nputils.py in __setitem__(self, key, value)
    132         mixed_positions, vindex_positions = _advanced_indexer_subspaces(key)
    133         self._array[key] = np.moveaxis(value, vindex_positions,
--> 134                                        mixed_positions)

~/conda/envs/xarray-dev/lib/python3.5/site-packages/numpy/core/numeric.py in moveaxis(a, source, destination)
   1599         transpose = a.transpose
   1600
-> 1601     source = normalize_axis_tuple(source, a.ndim, 'source')
   1602     destination = normalize_axis_tuple(destination, a.ndim, 'destination')
   1603     if len(source) != len(destination):

~/conda/envs/xarray-dev/lib/python3.5/site-packages/numpy/core/numeric.py in normalize_axis_tuple(axis, ndim, argname, allow_duplicate)
   1534     except TypeError:
   1535         axis = tuple(axis)
-> 1536     axis = tuple(normalize_axis_index(ax, ndim, argname) for ax in axis)
   1537     if not allow_duplicate and len(set(axis)) != len(axis):
   1538         if argname:

~/conda/envs/xarray-dev/lib/python3.5/site-packages/numpy/core/numeric.py in <genexpr>(.0)
   1534     except TypeError:
   1535         axis = tuple(axis)
-> 1536     axis = tuple(normalize_axis_index(ax, ndim, argname) for ax in axis)
   1537     if not allow_duplicate and len(set(axis)) != len(axis):
   1538         if argname:

AxisError: source: axis 0 is out of bounds for array of dimension 0

Assignment does work when the right-hand-side argument is an xarray.Variable, e.g.,

In [11]: xarr.variable[l_indices.variable, c_indices.variable] = xr.Variable((), 100)

In [12]: xarr
Out[12]:
<xarray.DataArray (y: 5, x: 5)>
array([[  0, 100,   2,   3,   4],
       [  5,   6,   7, 100,   9],
       [100,  11,  12,  13,  14],
       [ 15,  16, 100,  18,  19],
       [ 20,  21,  22,  23,  24]])
Dimensions without coordinates: y, x

Apparently we need a little more test coverage for assignment with vectorized indexing :).

CC @fujiisoup

@fujiisoup
Copy link
Member

@shoyer Thanks for the investigation. I will look inside later today oTL.

@fujiisoup
Copy link
Member

Closed by #1746

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants