Skip to content

Commit 7e08ca0

Browse files
committed
Add override_repr option to np.printoptions
1 parent 30dfe94 commit 7e08ca0

File tree

3 files changed

+29
-6
lines changed

3 files changed

+29
-6
lines changed

numpy/_core/arrayprint.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,14 @@
5959
'formatter': None,
6060
# Internally stored as an int to simplify comparisons; converted from/to
6161
# str/False on the way in/out.
62-
'legacy': sys.maxsize}
62+
'legacy': sys.maxsize,
63+
'override_repr': None,
64+
}
6365

6466
def _make_options_dict(precision=None, threshold=None, edgeitems=None,
6567
linewidth=None, suppress=None, nanstr=None, infstr=None,
66-
sign=None, formatter=None, floatmode=None, legacy=None):
68+
sign=None, formatter=None, floatmode=None, legacy=None,
69+
override_repr=None):
6770
"""
6871
Make a dictionary out of the non-None arguments, plus conversion of
6972
*legacy* and sanity checks.
@@ -119,7 +122,7 @@ def _make_options_dict(precision=None, threshold=None, edgeitems=None,
119122
def set_printoptions(precision=None, threshold=None, edgeitems=None,
120123
linewidth=None, suppress=None, nanstr=None,
121124
infstr=None, formatter=None, sign=None, floatmode=None,
122-
*, legacy=None):
125+
*, legacy=None, override_repr=None):
123126
"""
124127
Set printing options.
125128
@@ -224,6 +227,9 @@ def set_printoptions(precision=None, threshold=None, edgeitems=None,
224227
225228
.. versionadded:: 1.14.0
226229
.. versionchanged:: 1.22.0
230+
override_repr: callable, optional
231+
If set a passed function will be used for generating arrays' repr.
232+
Other options will be ignored.
227233
228234
See Also
229235
--------
@@ -285,9 +291,10 @@ def set_printoptions(precision=None, threshold=None, edgeitems=None,
285291
"""
286292
opt = _make_options_dict(precision, threshold, edgeitems, linewidth,
287293
suppress, nanstr, infstr, sign, formatter,
288-
floatmode, legacy)
289-
# formatter is always reset
294+
floatmode, legacy, override_repr)
295+
# formatter and override_repr are always reset
290296
opt['formatter'] = formatter
297+
opt['override_repr'] = override_repr
291298
_format_options.update(opt)
292299

293300
# set the C variable for legacy mode
@@ -1552,6 +1559,10 @@ def _array_repr_implementation(
15521559
arr, max_line_width=None, precision=None, suppress_small=None,
15531560
array2string=array2string):
15541561
"""Internal version of array_repr() that allows overriding array2string."""
1562+
override_repr = _format_options["override_repr"]
1563+
if override_repr is not None:
1564+
return override_repr(arr)
1565+
15551566
if max_line_width is None:
15561567
max_line_width = _format_options['linewidth']
15571568

numpy/_core/arrayprint.pyi

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ def set_printoptions(
6363
sign: Literal[None, "-", "+", " "] = ...,
6464
floatmode: None | _FloatMode = ...,
6565
*,
66-
legacy: Literal[None, False, "1.13", "1.21"] = ...
66+
legacy: Literal[None, False, "1.13", "1.21"] = ...,
67+
override_repr: None | Callable[[NDArray[Any]], str] = ...,
6768
) -> None: ...
6869
def get_printoptions() -> _FormatOptions: ...
6970
def array2string(

numpy/_core/tests/test_arrayprint.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -667,6 +667,17 @@ def test_formatter_reset(self):
667667
np.set_printoptions(formatter={'float_kind':None})
668668
assert_equal(repr(x), "array([0., 1., 2.])")
669669

670+
def test_override_repr(self):
671+
x = np.arange(3)
672+
np.set_printoptions(override_repr=lambda x: "FOO")
673+
assert_equal(repr(x), "FOO")
674+
np.set_printoptions(override_repr=None)
675+
assert_equal(repr(x), "array([0, 1, 2])")
676+
677+
with np.printoptions(override_repr=lambda x: "BAR"):
678+
assert_equal(repr(x), "BAR")
679+
assert_equal(repr(x), "array([0, 1, 2])")
680+
670681
def test_0d_arrays(self):
671682
assert_equal(str(np.array('café', '<U4')), 'café')
672683

0 commit comments

Comments
 (0)