diff --git a/pandas/_libs/lib.pyx b/pandas/_libs/lib.pyx index ec89e52e2eff7..25142cad9a30d 100644 --- a/pandas/_libs/lib.pyx +++ b/pandas/_libs/lib.pyx @@ -1704,10 +1704,15 @@ cdef class Validator: cdef bint _validate(self, ndarray values) except -1: cdef: Py_ssize_t i - Py_ssize_t n = self.n + Py_ssize_t n = values.size + flatiter it = PyArray_IterNew(values) for i in range(n): - if not self.is_valid(values[i]): + # The PyArray_GETITEM and PyArray_ITER_NEXT are faster + # equivalents to `val = values[i]` + val = PyArray_GETITEM(values, PyArray_ITER_DATA(it)) + PyArray_ITER_NEXT(it) + if not self.is_valid(val): return False return True @@ -1717,10 +1722,15 @@ cdef class Validator: cdef bint _validate_skipna(self, ndarray values) except -1: cdef: Py_ssize_t i - Py_ssize_t n = self.n + Py_ssize_t n = values.size + flatiter it = PyArray_IterNew(values) for i in range(n): - if not self.is_valid_skipna(values[i]): + # The PyArray_GETITEM and PyArray_ITER_NEXT are faster + # equivalents to `val = values[i]` + val = PyArray_GETITEM(values, PyArray_ITER_DATA(it)) + PyArray_ITER_NEXT(it) + if not self.is_valid_skipna(val): return False return True diff --git a/pandas/core/arrays/string_.py b/pandas/core/arrays/string_.py index 5a8e5f488fbf2..df71501d55b20 100644 --- a/pandas/core/arrays/string_.py +++ b/pandas/core/arrays/string_.py @@ -318,9 +318,7 @@ def __init__(self, values, copy=False): def _validate(self): """Validate that we only store NA or strings.""" - if len(self._ndarray) and not lib.is_string_array( - self._ndarray.ravel("K"), skipna=True - ): + if len(self._ndarray) and not lib.is_string_array(self._ndarray, skipna=True): raise ValueError("StringArray requires a sequence of strings or pandas.NA") if self._ndarray.dtype != "object": raise ValueError( diff --git a/pandas/core/dtypes/inference.py b/pandas/core/dtypes/inference.py index ae961e53d8b79..1f1486b1b29a7 100644 --- a/pandas/core/dtypes/inference.py +++ b/pandas/core/dtypes/inference.py @@ -447,5 +447,5 @@ def is_inferred_bool_dtype(arr: ArrayLike) -> bool: if dtype == np.dtype(bool): return True elif dtype == np.dtype("object"): - return lib.is_bool_array(arr.ravel("K")) + return lib.is_bool_array(arr) return False diff --git a/pandas/tests/dtypes/test_inference.py b/pandas/tests/dtypes/test_inference.py index 64a635707c2ff..5936248456ca7 100644 --- a/pandas/tests/dtypes/test_inference.py +++ b/pandas/tests/dtypes/test_inference.py @@ -1429,9 +1429,11 @@ def test_other_dtypes_for_array(self, func): func = getattr(lib, func) arr = np.array(["foo", "bar"]) assert not func(arr) + assert not func(arr.reshape(2, 1)) arr = np.array([1, 2]) assert not func(arr) + assert not func(arr.reshape(2, 1)) def test_date(self):