{"record":{"id":"9c9392b1bef69ce6","repo":"roboflow/supervision","slug":"all-data-values-within-a-single-object-must-have-e","errorCode":null,"errorMessage":"All data values within a single object must have equal length.","messagePattern":"All data values within a single object must have equal length\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"src/supervision/detection/utils/internal.py","lineNumber":570,"sourceCode":"    Returns:\n        A single data payload containing the merged data, preserving the original data\n            types (list or npt.NDArray[np.generic]).\n\n    Raises:\n        ValueError: If data values within a single object have different lengths or if\n            dictionaries have different keys.\n    \"\"\"\n    if not data_list:\n        return {}\n\n    all_keys_sets = [set(data.keys()) for data in data_list]\n    if not all(keys_set == all_keys_sets[0] for keys_set in all_keys_sets):\n        raise ValueError(\"All data dictionaries must have the same keys to merge.\")\n\n    for data in data_list:\n        lengths = [len(value) for value in data.values()]\n        if len(set(lengths)) > 1:\n            raise ValueError(\n                \"All data values within a single object must have equal length.\"\n            )\n\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:","sourceCodeStart":552,"sourceCodeEnd":588,"githubUrl":"https://github.com/roboflow/supervision/blob/7f254d9784d4c37e0f03cd89ddee164c8db099c0/src/supervision/detection/utils/internal.py#L552-L588","documentation":"Raised by merge_data during Detections merging when, inside a single Detections object, the per-detection data arrays/lists stored under different keys have unequal lengths. Every value in detections.data must be aligned with xyxy (same number of entries), and a violation inside any one input object aborts the merge.","triggerScenarios":"sv.Detections.merge([d1, ...]) or concatenate where one input was constructed with data={'class_name': np.array(['a','b']), 'track_id': [1]} — lengths 2 vs 1. Any data key whose length differs from len(xyxy) of that same Detections triggers it during merge.","commonSituations":"Hand-building Detections with data dicts where one key was forgotten when appending a new detection; a connector or custom code that appends to xyxy but not to every data field; caching/pickling Detections created by an older code version with fewer data fields.","solutions":["Audit the offending Detections: assert all(len(v) == len(d.xyxy) for v in d.data.values()) on each input before merge and fix the misaligned field","Rebuild the Detections from scratch with all data fields the same length instead of mutating d.data in place","Drop the misaligned key from data before merging if it is not needed"],"exampleFix":"# before\nbad = sv.Detections(xyxy=boxes, data={'a': names[:3], 'b': ids[:2]})\nsv.Detections.merge([bad, other])\n# after\nbad = sv.Detections(xyxy=boxes, data={'a': names[:3], 'b': ids[:3]})\nsv.Detections.merge([bad, other])","handlingStrategy":"validation","validationCode":"def assert_aligned_data(d):\n    n = len(d.xyxy)\n    for k, v in d.data.items():\n        assert len(v) == n, f\"data['{k}'] len {len(v)} != xyxy len {n}\"","typeGuard":null,"tryCatchPattern":"try:\n    merged = sv.Detections.merge(detections_list)\nexcept ValueError as e:\n    if \"equal length\" in str(e):\n        for d in detections_list:\n            bad = [k for k, v in d.data.items() if len(v) != len(d.xyxy)]\n        raise ValueError(f\"misaligned data keys {bad}\") from e\n    raise","preventionTips":["Never mutate detections.data in place; rebuild Detections when detection counts change","Assert data-length alignment in every custom connector before returning Detections","Prefer np.ndarray data values so shape mismatches fail loudly at construction time"],"tags":["detections","data-dict","merge","validation"],"backgroundTag":null,"analyzedSha":"7f254d9784d4c37e0f03cd89ddee164c8db099c0","analyzedAt":"2026-08-15T05:13:01.950Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}