|
2 | 2 |
|
3 | 3 | import hypothesis.extra.numpy as npst
|
4 | 4 | import hypothesis.strategies as st
|
| 5 | +import xarray as xr |
5 | 6 | import xarray.testing.strategies as xrst
|
6 | 7 | from hypothesis import given
|
7 | 8 |
|
@@ -51,6 +52,24 @@ def orthogonal_indexers(draw, sizes, indexer_types):
|
51 | 52 | return {dim: draw(indexer) for dim, indexer in concrete_indexers.items()}
|
52 | 53 |
|
53 | 54 |
|
| 55 | +@st.composite |
| 56 | +def vectorized_indexers(draw, sizes): |
| 57 | + max_size = max(sizes.values()) |
| 58 | + shape = draw(st.integers(min_value=1, max_value=max_size)) |
| 59 | + dtypes = npst.integer_dtypes() |
| 60 | + |
| 61 | + indexers = { |
| 62 | + dim: npst.arrays( |
| 63 | + dtypes, shape, elements={"min_value": -size, "max_value": size - 1} |
| 64 | + ) |
| 65 | + for dim, size in sizes.items() |
| 66 | + } |
| 67 | + |
| 68 | + return { |
| 69 | + dim: xr.Variable("points", draw(indexer)) for dim, indexer in indexers.items() |
| 70 | + } |
| 71 | + |
| 72 | + |
54 | 73 | class IndexingTests(DuckArrayTestMixin):
|
55 | 74 | @property
|
56 | 75 | def orthogonal_indexer_types(self):
|
@@ -78,3 +97,17 @@ def test_variable_isel_orthogonal(self, data):
|
78 | 97 |
|
79 | 98 | assert isinstance(actual, self.array_type), f"wrong type: {type(actual)}"
|
80 | 99 | self.assert_equal(actual, expected)
|
| 100 | + |
| 101 | + @given(st.data()) |
| 102 | + def test_variable_isel_vectorized(self, data): |
| 103 | + variable = data.draw(xrst.variables(array_strategy_fn=self.array_strategy_fn)) |
| 104 | + idx = data.draw(vectorized_indexers(variable.sizes)) |
| 105 | + |
| 106 | + with self.expected_errors("isel_vectorized", variable=variable): |
| 107 | + actual = variable.isel(idx).data |
| 108 | + |
| 109 | + raw_indexers = {dim: idx.get(dim, slice(None)) for dim in variable.dims} |
| 110 | + expected = variable.data[*raw_indexers.values()] |
| 111 | + |
| 112 | + assert isinstance(actual, self.array_type), f"wrong type: {type(actual)}" |
| 113 | + self.assert_equal(actual, expected) |
0 commit comments