diff --git a/src/awkward/highlevel.py b/src/awkward/highlevel.py index 6d1d6649aa..d878d9929a 100644 --- a/src/awkward/highlevel.py +++ b/src/awkward/highlevel.py @@ -12,6 +12,7 @@ import keyword import pickle import re +import weakref from collections.abc import Iterable, Mapping, Sequence, Sized from awkward_cpp.lib import _ext @@ -488,13 +489,19 @@ def named_axis(self) -> AxisMapping: class Mask: def __init__(self, array): - self._array = array + self._array = weakref.ref(array) def __getitem__(self, where): + array = self._array() + if array is None: + msg = "The array to mask was deleted before it could be masked. " + msg += "If you want to construct this mask, you must either keep the array alive " + msg += "or use 'ak.mask' explicitly." + raise ValueError(msg) with ak._errors.OperationErrorContext( - "ak.Array.mask", args=[self._array, where], kwargs={} + "ak.Array.mask", args=[array, where], kwargs={} ): - return ak.operations.mask(self._array, where, valid_when=True) + return ak.operations.mask(array, where, valid_when=True) @property def mask(self): diff --git a/tests/test_2020_reduce_axis_none.py b/tests/test_2020_reduce_axis_none.py index 9ecc6f30f4..b621f10024 100644 --- a/tests/test_2020_reduce_axis_none.py +++ b/tests/test_2020_reduce_axis_none.py @@ -15,9 +15,11 @@ def test_sum(): assert ak.almost_equal( ak.sum(array, axis=None, keepdims=True), ak.to_regular([[63.0]]) ) + + arr = ak.Array([[63.0]]) assert ak.almost_equal( ak.sum(array, axis=None, keepdims=True, mask_identity=True), - ak.to_regular(ak.Array([[63.0]]).mask[[[True]]]), + ak.to_regular(arr.mask[[[True]]]), ) assert ak.sum(array[2], axis=None, mask_identity=True) is None @@ -31,9 +33,10 @@ def test_prod(): assert ak.almost_equal( ak.prod(array[1:], axis=None, keepdims=True), ak.to_regular([[4838400.0]]) ) + arr = ak.Array([[4838400.0]]) assert ak.almost_equal( ak.prod(array[1:], axis=None, keepdims=True, mask_identity=True), - ak.to_regular(ak.Array([[4838400.0]]).mask[[[True]]]), + ak.to_regular(arr.mask[[[True]]]), ) assert ak.prod(array[2], axis=None, mask_identity=True) is None @@ -49,13 +52,16 @@ def test_min(): ak.to_regular([[-100.0]]), ) + arr = ak.Array([[0.0]]) assert ak.almost_equal( ak.min(array, axis=None, keepdims=True, mask_identity=True), - ak.to_regular(ak.Array([[0.0]]).mask[[[True]]]), + ak.to_regular(arr.mask[[[True]]]), ) + + arr = ak.Array([[np.inf]]) assert ak.almost_equal( ak.min(array[-1:], axis=None, keepdims=True, mask_identity=True), - ak.to_regular(ak.Array([[np.inf]]).mask[[[False]]]), + ak.to_regular(arr.mask[[[False]]]), ) assert ak.min(array[2], axis=None, mask_identity=True) is None @@ -70,13 +76,17 @@ def test_max(): ak.max(array, axis=None, keepdims=True, initial=100, mask_identity=False), ak.to_regular([[100.0]]), ) + + arr = ak.Array([[10.0]]) assert ak.almost_equal( ak.max(array, axis=None, keepdims=True, mask_identity=True), - ak.to_regular(ak.Array([[10.0]]).mask[[[True]]]), + ak.to_regular(arr.mask[[[True]]]), ) + + arr = ak.Array([[-np.inf]]) assert ak.almost_equal( ak.max(array[-1:], axis=None, keepdims=True, mask_identity=True), - ak.to_regular(ak.Array([[np.inf]]).mask[[[False]]]), + ak.to_regular(arr.mask[[[False]]]), ) assert ak.max(array[2], axis=None, mask_identity=True) is None @@ -87,13 +97,17 @@ def test_count(): ak.count(array, axis=None, keepdims=True, mask_identity=False), ak.to_regular([[12]]), ) + + arr = ak.Array([[12]]) assert ak.almost_equal( ak.count(array, axis=None, keepdims=True, mask_identity=True), - ak.to_regular(ak.Array([[12]]).mask[[[True]]]), + ak.to_regular(arr.mask[[[True]]]), ) + + arr = ak.Array([[0]]) assert ak.almost_equal( ak.count(array[-1:], axis=None, keepdims=True, mask_identity=True), - ak.to_regular(ak.Array([[0]]).mask[[[False]]]), + ak.to_regular(arr.mask[[[False]]]), ) assert ak.count(array[2], axis=None, mask_identity=True) is None assert ak.count(array[2], axis=None, mask_identity=False) == 0 @@ -105,13 +119,17 @@ def test_count_nonzero(): ak.count_nonzero(array, axis=None, keepdims=True, mask_identity=False), ak.to_regular([[11]]), ) + + arr = ak.Array([[11]]) assert ak.almost_equal( ak.count_nonzero(array, axis=None, keepdims=True, mask_identity=True), - ak.to_regular(ak.Array([[11]]).mask[[[True]]]), + ak.to_regular(arr.mask[[[True]]]), ) + + arr = ak.Array([[0]]) assert ak.almost_equal( ak.count_nonzero(array[-1:], axis=None, keepdims=True, mask_identity=True), - ak.to_regular(ak.Array([[0]]).mask[[[False]]]), + ak.to_regular(arr.mask[[[False]]]), ) assert ak.count_nonzero(array[2], axis=None, mask_identity=True) is None assert ak.count_nonzero(array[2], axis=None, mask_identity=False) == 0 @@ -123,17 +141,20 @@ def test_std(): ak.std(array, axis=None, keepdims=True, mask_identity=False), ak.to_regular([[3.139134700306227]]), ) + + arr = ak.Array([[3.139134700306227]]) assert ak.almost_equal( ak.std(array, axis=None, keepdims=True, mask_identity=True), - ak.to_regular(ak.Array([[3.139134700306227]]).mask[[[True]]]), + ak.to_regular(arr.mask[[[True]]]), ) assert np.isnan(ak.std(array[2], axis=None, mask_identity=False)) def test_std_no_mask_axis_none(): + arr = ak.Array([[0.0]]) assert ak.almost_equal( ak.std(array[-1:], axis=None, keepdims=True, mask_identity=True), - ak.to_regular(ak.Array([[0.0]]).mask[[[False]]]), + ak.to_regular(arr.mask[[[False]]]), ) assert ak.std(array[2], axis=None, mask_identity=True) is None @@ -144,17 +165,20 @@ def test_var(): ak.var(array, axis=None, keepdims=True, mask_identity=False), ak.to_regular([[9.854166666666666]]), ) + + arr = ak.Array([[9.854166666666666]]) assert ak.almost_equal( ak.var(array, axis=None, keepdims=True, mask_identity=True), - ak.to_regular(ak.Array([[9.854166666666666]]).mask[[[True]]]), + ak.to_regular(arr.mask[[[True]]]), ) assert np.isnan(ak.var(array[2], axis=None, mask_identity=False)) def test_var_no_mask_axis_none(): + arr = ak.Array([[0.0]]) assert ak.almost_equal( ak.var(array[-1:], axis=None, keepdims=True, mask_identity=True), - ak.to_regular(ak.Array([[0.0]]).mask[[[False]]]), + ak.to_regular(arr.mask[[[False]]]), ) assert ak.var(array[2], axis=None, mask_identity=True) is None @@ -165,17 +189,20 @@ def test_mean(): ak.mean(array, axis=None, keepdims=True, mask_identity=False), ak.to_regular([[5.25]]), ) + + arr = ak.Array([[5.25]]) assert ak.almost_equal( ak.mean(array, axis=None, keepdims=True, mask_identity=True), - ak.to_regular(ak.Array([[5.25]]).mask[[[True]]]), + ak.to_regular(arr.mask[[[True]]]), ) assert np.isnan(ak.mean(array[2], axis=None, mask_identity=False)) def test_mean_no_mask_axis_none(): + arr = ak.Array([[0.0]]) assert ak.almost_equal( ak.mean(array[-1:], axis=None, keepdims=True, mask_identity=True), - ak.to_regular(ak.Array([[0.0]]).mask[[[False]]]), + ak.to_regular(arr.mask[[[False]]]), ) assert ak.mean(array[2], axis=None, mask_identity=True) is None @@ -186,17 +213,20 @@ def test_ptp(): ak.ptp(array, axis=None, keepdims=True, mask_identity=False), ak.to_regular([[10.0]]), ) + + arr = ak.Array([[10.0]]) assert ak.almost_equal( ak.ptp(array, axis=None, keepdims=True, mask_identity=True), - ak.to_regular(ak.Array([[10.0]]).mask[[[True]]]), + ak.to_regular(arr.mask[[[True]]]), ) assert ak.ptp(array[2], axis=None, mask_identity=False) == pytest.approx(0.0) def test_ptp_no_mask_axis_none(): + arr = ak.Array([[0.0]]) assert ak.almost_equal( ak.ptp(array[-1:], axis=None, keepdims=True, mask_identity=True), - ak.to_regular(ak.Array([[0.0]]).mask[[[False]]]), + ak.to_regular(arr.mask[[[False]]]), ) assert ak.ptp(array[2], axis=None, mask_identity=True) is None @@ -207,13 +237,17 @@ def test_argmax(): ak.argmax(array, axis=None, keepdims=True, mask_identity=False), ak.to_regular([[11]]), ) + + arr = ak.Array([[11]]) assert ak.almost_equal( ak.argmax(array, axis=None, keepdims=True, mask_identity=True), - ak.to_regular(ak.Array([[11]]).mask[[[True]]]), + ak.to_regular(arr.mask[[[True]]]), ) + + arr = ak.Array([[0]]) assert ak.almost_equal( ak.argmax(array[-1:], axis=None, keepdims=True, mask_identity=True), - ak.to_regular(ak.Array([[0]]).mask[[[False]]]), + ak.to_regular(arr.mask[[[False]]]), ) assert ak.argmax(array[2], axis=None, mask_identity=True) is None assert ak.argmax(array[2], axis=None, mask_identity=False) == -1 @@ -225,13 +259,17 @@ def test_argmin(): ak.argmin(array, axis=None, keepdims=True, mask_identity=False), ak.to_regular([[0]]), ) + + arr = ak.Array([[0]]) assert ak.almost_equal( ak.argmin(array, axis=None, keepdims=True, mask_identity=True), - ak.to_regular(ak.Array([[0]]).mask[[[True]]]), + ak.to_regular(arr.mask[[[True]]]), ) + + arr = ak.Array([[999]]) assert ak.almost_equal( ak.argmin(array[-1:], axis=None, keepdims=True, mask_identity=True), - ak.to_regular(ak.Array([[999]]).mask[[[False]]]), + ak.to_regular(arr.mask[[[False]]]), ) assert ak.argmin(array[2], axis=None, mask_identity=True) is None assert ak.argmin(array[2], axis=None, mask_identity=False) == -1 @@ -243,13 +281,17 @@ def test_any(): ak.any(array, axis=None, keepdims=True, mask_identity=False), ak.to_regular([[True]]), ) + + arr = ak.Array([[True]]) assert ak.almost_equal( ak.any(array, axis=None, keepdims=True, mask_identity=True), - ak.to_regular(ak.Array([[True]]).mask[[[True]]]), + ak.to_regular(arr.mask[[[True]]]), ) + + arr = ak.Array([[True]]) assert ak.almost_equal( ak.any(array[-1:], axis=None, keepdims=True, mask_identity=True), - ak.to_regular(ak.Array([[True]]).mask[[[False]]]), + ak.to_regular(arr.mask[[[False]]]), ) assert ak.any(array[2], axis=None, mask_identity=True) is None assert not ak.any(array[2], axis=None, mask_identity=False) @@ -261,13 +303,17 @@ def test_all(): ak.all(array, axis=None, keepdims=True, mask_identity=False), ak.to_regular([[False]]), ) + + arr = ak.Array([[False]]) assert ak.almost_equal( ak.all(array, axis=None, keepdims=True, mask_identity=True), - ak.to_regular(ak.Array([[False]]).mask[[[True]]]), + ak.to_regular(arr.mask[[[True]]]), ) + + arr = ak.Array([[False]]) assert ak.almost_equal( ak.all(array[-1:], axis=None, keepdims=True, mask_identity=True), - ak.to_regular(ak.Array([[False]]).mask[[[False]]]), + ak.to_regular(arr.mask[[[False]]]), ) assert ak.all(array[2], axis=None, mask_identity=True) is None assert ak.all(array[2], axis=None, mask_identity=False) diff --git a/tests/test_2064_fill_none_record.py b/tests/test_2064_fill_none_record.py index e98541911b..169d3bb757 100644 --- a/tests/test_2064_fill_none_record.py +++ b/tests/test_2064_fill_none_record.py @@ -24,5 +24,6 @@ def test_axis_last(): def test_option_outside_record(): - record = ak.zip({"x": [1, 4], "y": [2, 3]}).mask[[True, False]] + record = ak.zip({"x": [1, 4], "y": [2, 3]}) + record = record.mask[[True, False]] assert ak.fill_none(record, 0, axis=-1).to_list() == [{"x": 1, "y": 2}, 0]