Dear all, I would like to discuss a «cosmetic» feature for numpy. I find it useful in my day-to-day work to inspect the values of 1D and 2D numpy arrays. Typically I was saving the data in the .txt format and then used the next best tool to analyse the numbers. However, I would prefer to be able to just print an array directly in the interactive console (python console for instance) and have the printed array formatted in such a way that it can be easily read by human eyes. Now, the type of formatting is subjective. Nevertheless, I would like to propose the one that I have converged to over the years. The proposed implementation is a standalone function, written in pure python (as this «visual» representation will be suitable only for the reasonable-sized array, then there is no need to worry about the performance), for example, def decorate_array( object: array_like, fmt: str, header: list, footer: list, column_header: list, footer column: list, …, ) If the numpy community agrees that this function fits in the package, then I would like to adapt the implementation that I am using now. I would open a PR, but I saw that it is recommended to ask for an opinion on this mailing list first. Below are the examples of how this function would behave (again, the style is subjective): 1. Plain real-valued array decorate_array( object = np.random.random((10,3)), fmt = ">.4f", ) ┌────────┬────────┬────────┐ │ 0.0410 │ 0.2844 │ 0.4251 │ ├────────┼────────┼────────┤ │ 0.9270 │ 0.7509 │ 0.9892 │ ├────────┼────────┼────────┤ │ 0.7380 │ 0.1245 │ 0.1855 │ ├────────┼────────┼────────┤ │ 0.4738 │ 0.6671 │ 0.8455 │ ├────────┼────────┼────────┤ │ 0.4442 │ 0.5946 │ 0.5874 │ ├────────┼────────┼────────┤ │ 0.0789 │ 0.5374 │ 0.6505 │ ├────────┼────────┼────────┤ │ 0.8006 │ 0.0970 │ 0.4456 │ ├────────┼────────┼────────┤ │ 0.4884 │ 0.4162 │ 0.8283 │ ├────────┼────────┼────────┤ │ 0.5082 │ 0.5625 │ 0.8812 │ ├────────┼────────┼────────┤ │ 0.2013 │ 0.9937 │ 0.3731 │ └────────┴────────┴────────┘ 2. Headers and footers decorate_array( object = np.random.random((2,3)), fmt = ">.5f", header = ["l-h-corner", "h1", "h2", "h3"], footer = ["l-f-corner", "f1", "f2", "f3"], column_header = ["ch1", "ch2", "ch3"], footer column = ["cf1", "cf2", "cf3"], ) ┌────────────┬─────────┬─────────┬─────────┬─────┐ │ l-h-corner │ h1 │ h2 │ h3 │ │ ├────────────┼─────────┼─────────┼─────────┼─────┤ │ ch1 │ 0.84675 │ 0.80002 │ 0.79360 │ cf1 │ ├────────────┼─────────┼─────────┼─────────┼─────┤ │ ch2 │ 0.93482 │ 0.28542 │ 0.28057 │ cf2 │ ├────────────┼─────────┼─────────┼─────────┼─────┤ │ l-f-corner │ f1 │ f2 │ f3 │ │ └────────────┴─────────┴─────────┴─────────┴─────┘ 3. Complex numbers ┌──────────────┬──────────────┬──────────────┐ │ 0.60 - i0.12 │ 0.66 + i0.18 │ 0.31 - i0.22 │ ├──────────────┼──────────────┼──────────────┤ │ 0.52 - i0.33 │ 0.05 - i0.03 │ 0.23 + i0.37 │ └──────────────┴──────────────┴──────────────┘ There are more verbose examples written in the docs page of my sandbox python package, but I am not sure if posting the link to it here would be appropriate. The three examples above should be enough to grasp the idea. Best, Andrey
How much of this functionality is available in the tabulate package? _JM ______ John Mark Agosta LinkedIn: https://www.linkedin.com/in/john-mark-agosta/ johnmark.agosta@gmail.com Find me at https://medium.com/@johnmark54 On Tue, Aug 5, 2025 at 6:55 AM Андрей Рыбаков via NumPy-Discussion < numpy-discussion@python.org> wrote:
Dear all,
I would like to discuss a «cosmetic» feature for numpy.
I find it useful in my day-to-day work to inspect the values of 1D and 2D numpy arrays. Typically I was saving the data in the .txt format and then used the next best tool to analyse the numbers.
However, I would prefer to be able to just print an array directly in the interactive console (python console for instance) and have the printed array formatted in such a way that it can be easily read by human eyes.
Now, the type of formatting is subjective. Nevertheless, I would like to propose the one that I have converged to over the years.
The proposed implementation is a standalone function, written in pure python (as this «visual» representation will be suitable only for the reasonable-sized array, then there is no need to worry about the performance), for example,
def decorate_array(
object: array_like,
fmt: str,
header: list,
footer: list,
column_header: list,
footer column: list,
…,
)
If the numpy community agrees that this function fits in the package, then I would like to adapt the implementation that I am using now. I would open a PR, but I saw that it is recommended to ask for an opinion on this mailing list first.
Below are the examples of how this function would behave (again, the style is subjective):
1. Plain real-valued array
decorate_array(
object = np.random.random((10,3)),
fmt = ">.4f",
)
┌────────┬────────┬────────┐
│ 0.0410 │ 0.2844 │ 0.4251 │
├────────┼────────┼────────┤
│ 0.9270 │ 0.7509 │ 0.9892 │
├────────┼────────┼────────┤
│ 0.7380 │ 0.1245 │ 0.1855 │
├────────┼────────┼────────┤
│ 0.4738 │ 0.6671 │ 0.8455 │
├────────┼────────┼────────┤
│ 0.4442 │ 0.5946 │ 0.5874 │
├────────┼────────┼────────┤
│ 0.0789 │ 0.5374 │ 0.6505 │
├────────┼────────┼────────┤
│ 0.8006 │ 0.0970 │ 0.4456 │
├────────┼────────┼────────┤
│ 0.4884 │ 0.4162 │ 0.8283 │
├────────┼────────┼────────┤
│ 0.5082 │ 0.5625 │ 0.8812 │
├────────┼────────┼────────┤
│ 0.2013 │ 0.9937 │ 0.3731 │
└────────┴────────┴────────┘
2. Headers and footers
decorate_array(
object = np.random.random((2,3)),
fmt = ">.5f",
header = ["l-h-corner", "h1", "h2", "h3"],
footer = ["l-f-corner", "f1", "f2", "f3"],
column_header = ["ch1", "ch2", "ch3"],
footer column = ["cf1", "cf2", "cf3"],
)
┌────────────┬─────────┬─────────┬─────────┬─────┐
│ l-h-corner │ h1 │ h2 │ h3 │ │
├────────────┼─────────┼─────────┼─────────┼─────┤
│ ch1 │ 0.84675 │ 0.80002 │ 0.79360 │ cf1 │
├────────────┼─────────┼─────────┼─────────┼─────┤
│ ch2 │ 0.93482 │ 0.28542 │ 0.28057 │ cf2 │
├────────────┼─────────┼─────────┼─────────┼─────┤
│ l-f-corner │ f1 │ f2 │ f3 │ │
└────────────┴─────────┴─────────┴─────────┴─────┘
3. Complex numbers
┌──────────────┬──────────────┬──────────────┐
│ 0.60 - i0.12 │ 0.66 + i0.18 │ 0.31 - i0.22 │
├──────────────┼──────────────┼──────────────┤
│ 0.52 - i0.33 │ 0.05 - i0.03 │ 0.23 + i0.37 │
└──────────────┴──────────────┴──────────────┘
There are more verbose examples written in the docs page of my sandbox python package, but I am not sure if posting the link to it here would be appropriate. The three examples above should be enough to grasp the idea.
Best,
Andrey
_______________________________________________ NumPy-Discussion mailing list -- numpy-discussion@python.org To unsubscribe send an email to numpy-discussion-leave@python.org https://mail.python.org/mailman3//lists/numpy-discussion.python.org Member address: johnmark.agosta@gmail.com
Well, what I ment to say was "Perhaps just the treatment of complex numbers is not available". Best, Andrey
participants (3)
-
John Mark Agosta -
rybakov.ad@icloud.com -
Андрей Рыбаков