OpenBB-finance/OpenBB · error · ValueError

Only 2D arrays are supported.

Error message

Only 2D arrays are supported.

What it means

ValueError from ndarray_to_basemodel: it maps a NumPy array's rows to Data records ({'column_0': v0, 'column_1': v1, ...}) and only supports 2D arrays (rows x columns). Passing a 1D vector, a 3D tensor, or a 0D scalar triggers this before any conversion happens.

Source

Thrown at openbb_platform/core/openbb_core/app/utils.py:124

            raise ValueError(f"Unsupported list item type: {type(item)}")
    return base_models


def dict_to_basemodel(data_dict: dict) -> Data:
    """Convert a dictionary to BaseModel."""
    try:
        return Data(**data_dict)
    except ValidationError as e:
        raise ValueError(
            f"Validation error when converting dict to BaseModel: {e}"
        ) from e


def ndarray_to_basemodel(array: "ndarray") -> list[Data]:
    """Convert a NumPy array to list of BaseModel."""
    # Assuming a 2D array where rows are records
    if array.ndim != 2:
        raise ValueError("Only 2D arrays are supported.")
    return [
        Data(**{f"column_{i}": value for i, value in enumerate(row)}) for row in array
    ]


def convert_to_basemodel(data) -> Data | list[Data]:
    """Dispatch function to convert different types to BaseModel."""
    # pylint: disable=import-outside-toplevel
    from numpy import ndarray
    from pandas import DataFrame, Series

    if isinstance(data, Data) or issubclass(type(data), Data):
        return data
    if isinstance(data, list):
        return list_to_basemodel(data)
    if isinstance(data, dict):
        return dict_to_basemodel(data)
    if isinstance(data, (DataFrame, Series)):

View on GitHub (pinned to 3e071fcc2c)

Solutions

  1. Reshape to 2D so each row is one record: arr.reshape(-1, 1) for a single column vector
  2. Or convert to a pandas DataFrame with named columns and pass that instead
  3. squeeze() 0-d/1-item arrays before conversion

Example fix

# before
import numpy as np
models = convert_to_basemodel(np.array([1.0, 2.0, 3.0]))

# after
import numpy as np
models = convert_to_basemodel(np.array([1.0, 2.0, 3.0]).reshape(-1, 1))
Defensive patterns

Strategy: type-guard

Validate before calling

import numpy as np

def array_ok(arr: 'np.ndarray') -> bool:
    return getattr(arr, 'ndim', None) == 2

Type guard

def is_2d_array(x) -> bool:
    import numpy as np
    return isinstance(x, np.ndarray) and x.ndim == 2

Try / catch

try:
    models = ndarray_to_basemodel(arr)
except ValueError as e:
    if 'Only 2D arrays' in str(e):
        models = ndarray_to_basemodel(np.atleast_2d(arr).reshape(-1, arr.shape[-1] if arr.ndim else 1))
    else:
        raise

Prevention

When it happens

Trigger: convert_to_basemodel(numpy.array([1, 2, 3])) (1D), a 3D array from a model output, or a masked/scalar 0-d array returned by a custom pipeline fed into OpenBB result processing.

Common situations: Feeding raw NumPy vectors (e.g. a single column of prices) instead of record matrices; ML model outputs with extra dimensions; squeeze() forgotten after indexing producing 0-d arrays.

Related errors


AI-assisted analysis of OpenBB-finance/OpenBB@3e071fcc2c (2026-08-14). Data as JSON: /api/errors/0bcd3cdea848b897. Report an issue: GitHub.