{"record":{"id":"8c80bd8b31217856","repo":"roboflow/supervision","slug":"inconsistent-data-types-for-key-key-only-np-n","errorCode":null,"errorMessage":"Inconsistent data types for key '{key}'. Only np.ndarray and list types are allowed.","messagePattern":"Inconsistent data types for key '(.+?)'\\. Only np\\.ndarray and list types are allowed\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"src/supervision/detection/utils/internal.py","lineNumber":591,"sourceCode":"\n    merged_data: dict[str, Any] = {key: [] for key in all_keys_sets[0]}\n    for data in data_list:\n        for key in data:\n            merged_data[key].append(data[key])\n\n    for key in merged_data:\n        if all(isinstance(item, list) for item in merged_data[key]):\n            merged_data[key] = list(chain.from_iterable(merged_data[key]))\n        elif all(isinstance(item, np.ndarray) for item in merged_data[key]):\n            ndim = merged_data[key][0].ndim\n            if ndim == 1:\n                merged_data[key] = np.hstack(merged_data[key])\n            elif ndim > 1:\n                merged_data[key] = np.vstack(merged_data[key])\n            else:\n                raise ValueError(f\"Unexpected array dimension for key '{key}'.\")\n        else:\n            raise ValueError(\n                f\"Inconsistent data types for key '{key}'. Only np.ndarray and list \"\n                f\"types are allowed.\"\n            )\n\n    return cast(_DetectionDataType, merged_data)\n\n\ndef merge_metadata(metadata_list: list[_MetadataType]) -> _MetadataType:\n    \"\"\"\n    Merge metadata from a list of metadata dictionaries.\n\n    This function combines the metadata dictionaries. If a key appears in more than one\n    dictionary, the values must be identical for the merge to succeed.\n\n    Warning: Assumes that empty detections were filtered-out before passing metadata to\n    this function.\n\n    Args:","sourceCodeStart":573,"sourceCodeEnd":609,"githubUrl":"https://github.com/roboflow/supervision/blob/7f254d9784d4c37e0f03cd89ddee164c8db099c0/src/supervision/detection/utils/internal.py#L573-L609","documentation":"Raised by merge_data when, for one data key, the values coming from different Detections objects are neither all Python lists nor all np.ndarrays. The merge can only flatten lists with chain or stack arrays with hstack/vstack, so mixed container types for the same key are rejected.","triggerScenarios":"sv.Detections.merge([d1, d2]) where d1.data['key'] is a list and d2.data['key'] is an np.ndarray (or any other type like a tuple/str/int). Also raised when the value is a plain scalar type that is neither list nor ndarray in any input.","commonSituations":"One pipeline step stores data values as Python lists (common in custom code) while a library connector stores the same key as np.ndarray; mixing Detections built by from_ultralytics (ndarray data) with hand-built Detections (list data) under the same key name.","solutions":["Normalize the type of every data value to np.ndarray across all inputs before merging (e.g. d.data['key'] = np.asarray(d.data['key']))","If the value is a scalar per detection, wrap it as a 1-element-per-detection list or array aligned with xyxy","Use consistent data-field construction everywhere: always np.asarray when populating detections.data"],"exampleFix":"# before\nmerged = sv.Detections.merge([d_list_version, d_array_version])\n# after\nfor d in detections_list:\n    for k, v in d.data.items():\n        if not isinstance(v, np.ndarray):\n            d.data[k] = np.asarray(v)\nmerged = sv.Detections.merge(detections_list)","handlingStrategy":"validation","validationCode":"import numpy as np\n\ndef normalize_data_types(detections_list):\n    for d in detections_list:\n        for k, v in d.data.items():\n            if not isinstance(v, np.ndarray):\n                d.data[k] = np.asarray(v)\n    return detections_list","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Standardize on np.ndarray for all detections.data values project-wide","Ban plain-list data values in custom connectors via a lint/test helper","Run a normalization pass over Detections from external sources before merging"],"tags":["detections","data-dict","merge","numpy"],"backgroundTag":null,"analyzedSha":"7f254d9784d4c37e0f03cd89ddee164c8db099c0","analyzedAt":"2026-08-15T05:13:01.950Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}