{"record":{"id":"ad959a71519d0bb8","repo":"pandas-dev/pandas","slug":"values-must-be-a-numpy-array-not-type-values","errorCode":null,"errorMessage":"'values' must be a NumPy array, not {type(values).__name__}","messagePattern":"'values' must be a NumPy array, not (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"pandas/core/arrays/numpy_.py","lineNumber":128,"sourceCode":"    # ExtensionBlock, search for `ABCNumpyExtensionArray`. We check for\n    # that _typ to ensure that users don't unnecessarily use EAs inside\n    # pandas internals, which turns off things like block consolidation.\n    _typ = \"npy_extension\"\n    __array_priority__ = 1000\n    _ndarray: np.ndarray\n    _dtype: NumpyEADtype\n    _internal_fill_value = np.nan\n\n    # ------------------------------------------------------------------------\n    # Constructors\n\n    def __init__(\n        self, values: np.ndarray | NumpyExtensionArray, copy: bool = False\n    ) -> None:\n        if isinstance(values, type(self)):\n            values = values._ndarray\n        if not isinstance(values, np.ndarray):\n            raise ValueError(\n                f\"'values' must be a NumPy array, not {type(values).__name__}\"\n            )\n\n        if values.ndim == 0:\n            # Technically we support 2, but do not advertise that fact.\n            raise ValueError(\"NumpyExtensionArray must be 1-dimensional.\")\n\n        if copy:\n            values = values.copy()\n\n        dtype = NumpyEADtype(values.dtype)\n        super().__init__(values, dtype)\n\n    @classmethod\n    def _from_sequence(\n        cls, scalars, *, dtype: Dtype | None = None, copy: bool = False\n    ) -> NumpyExtensionArray:\n        if isinstance(dtype, NumpyEADtype):","sourceCodeStart":110,"sourceCodeEnd":146,"githubUrl":"https://github.com/pandas-dev/pandas/blob/71959b8cb9b2459c16e14b34f28b178ccfe14735/pandas/core/arrays/numpy_.py#L110-L146","documentation":"Raised by NumpyExtensionArray.__init__ when the `values` argument is neither an np.ndarray nor another NumpyExtensionArray. NumpyExtensionArray is the pandas ExtensionArray wrapper around a single NumPy ndarray, so it strictly requires a concrete ndarray backing store. Any other input (list, tuple, scalar, Series) is rejected at construction because the wrapper has no path to coerce it.","triggerScenarios":"Directly constructing pd.arrays.NumpyExtensionArray(<not-an-ndarray>), e.g. passing a Python list, a tuple, a pandas Series, or a scalar value. Also triggered when subclassing NumpyExtensionArray (e.g. StringArray paths) and feeding a non-ndarray result back into type(self)(...).","commonSituations":"Developers reach for pd.arrays.NumpyExtensionArray by mistake instead of pd.array(...) or pd.Series(...). Passing raw Python lists or a Series into the class constructor. Refactoring code that previously used np.asarray-only paths.","solutions":["Convert the input to an ndarray first: pd.arrays.NumpyExtensionArray(np.asarray(values)).","Use the public factory pd.array(values) instead of the NumpyExtensionArray constructor directly.","If the input is a list-like, wrap it with np.asarray(values, dtype=...) before passing."],"exampleFix":"# before\npd.arrays.NumpyExtensionArray([1, 2, 3])\n# after\npd.arrays.NumpyExtensionArray(np.asarray([1, 2, 3]))\n# or simply\npd.array([1, 2, 3])","handlingStrategy":"type-guard","validationCode":"import numpy as np\n\ndef to_numpy_ea(values):\n    if not isinstance(values, (np.ndarray, pd.arrays.NumpyExtensionArray)):\n        values = np.asarray(values)\n    return pd.arrays.NumpyExtensionArray(values)","typeGuard":"import numpy as np\n\ndef is_ndarray_like(values) -> bool:\n    return isinstance(values, (np.ndarray, pd.arrays.NumpyExtensionArray))","tryCatchPattern":"try:\n    arr = pd.arrays.NumpyExtensionArray(values)\nexcept ValueError:\n    arr = pd.arrays.NumpyExtensionArray(np.asarray(values))","preventionTips":["Prefer pd.array(values) over the NumpyExtensionArray constructor; it accepts any array-like.","Type-check inputs at API boundaries with isinstance(x, np.ndarray).","Avoid subclassing NumpyExtensionArray without normalizing results to ndarray."],"tags":["numpy","constructor","type-validation","pandas-arrays"],"analyzedSha":"71959b8cb9b2459c16e14b34f28b178ccfe14735","analyzedAt":"2026-08-07T01:30:20.476Z","schemaVersion":2},"datasetVersion":"2026-08-07T03:17:09.362Z"}