python-tabulate icon indicating copy to clipboard operation
python-tabulate copied to clipboard

FutureWarning if a table cell is a numpy array

Open alugowski opened this issue 2 years ago • 1 comments

import numpy as np
from tabulate import tabulate

data = [[np.ones(1)]]

print(tabulate(data))

Yields this warning from numpy:

/Users/enos/temp/venv/lib/python3.10/site-packages/tabulate/__init__.py:107: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison
  (len(row) >= 1 and row[0] == SEPARATING_LINE)
-
1
-

The cause is that the line detection function,

def _is_separating_line(row):
    row_type = type(row)
    is_sl = (row_type == list or row_type == str) and (
        (len(row) >= 1 and row[0] == SEPARATING_LINE)
        or (len(row) >= 2 and row[1] == SEPARATING_LINE)
    )
    return is_sl

performs the == operation. This is generally correct, but with numpy (and also other array packages) an == does elementwise comparisons and not object-level. This should still yield the correct answer, just inefficiently and numpy in particular emits that warning.

The fix is simple. Replace the == with is:

        (len(row) >= 1 and row[0] is SEPARATING_LINE)
        or (len(row) >= 2 and row[1] is SEPARATING_LINE)

The is should also be a tiny bit faster, too.

alugowski avatar Aug 26 '23 18:08 alugowski

Correction, this is now an error in the newest numpy:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

The fix is the same.

alugowski avatar Aug 26 '23 21:08 alugowski