1*b6fb3261SAndroid Build Coastguard WorkerFrom 74a767d42921001fc4569ecee3b8726383c42ad4 Mon Sep 17 00:00:00 2001 2*b6fb3261SAndroid Build Coastguard WorkerFrom: Bertrand MICHEL <[email protected]> 3*b6fb3261SAndroid Build Coastguard WorkerDate: Tue, 23 Feb 2021 10:57:28 +0100 4*b6fb3261SAndroid Build Coastguard WorkerSubject: [PATCH] Dtype kind vs char (#2864) 5*b6fb3261SAndroid Build Coastguard Worker 6*b6fb3261SAndroid Build Coastguard Worker* [dtype]: add type() method to access type attribute of PyArray_Descr (eq. to dtype.char in Python) 7*b6fb3261SAndroid Build Coastguard Worker 8*b6fb3261SAndroid Build Coastguard Worker* [dtype] change type() name method to char_() to be compliant with Python numpy interface 9*b6fb3261SAndroid Build Coastguard Worker 10*b6fb3261SAndroid Build Coastguard Worker* [dtype] fix by pre-commit 11*b6fb3261SAndroid Build Coastguard Worker 12*b6fb3261SAndroid Build Coastguard Worker* [dtype] Change comments and solutions format for test 13*b6fb3261SAndroid Build Coastguard Worker 14*b6fb3261SAndroid Build Coastguard Worker* Clarify documentation and move note about dtype.char vs PyArray_Descr::type to a plain, non-doxygen comment 15*b6fb3261SAndroid Build Coastguard Worker 16*b6fb3261SAndroid Build Coastguard Worker* Fix and extend tests 17*b6fb3261SAndroid Build Coastguard Worker 18*b6fb3261SAndroid Build Coastguard Worker* Fix the supposedly fixed tests 19*b6fb3261SAndroid Build Coastguard Worker 20*b6fb3261SAndroid Build Coastguard Worker* Fix the fixed tests again 21*b6fb3261SAndroid Build Coastguard Worker 22*b6fb3261SAndroid Build Coastguard WorkerCo-authored-by: Bertrand MICHEL <[email protected]> 23*b6fb3261SAndroid Build Coastguard WorkerCo-authored-by: Yannick Jadoul <[email protected]> 24*b6fb3261SAndroid Build Coastguard Worker--- 25*b6fb3261SAndroid Build Coastguard Worker include/pybind11/numpy.h | 12 +++++++++++- 26*b6fb3261SAndroid Build Coastguard Worker tests/test_numpy_dtypes.cpp | 20 ++++++++++++++++++++ 27*b6fb3261SAndroid Build Coastguard Worker tests/test_numpy_dtypes.py | 3 +++ 28*b6fb3261SAndroid Build Coastguard Worker 3 files changed, 34 insertions(+), 1 deletion(-) 29*b6fb3261SAndroid Build Coastguard Worker 30*b6fb3261SAndroid Build Coastguard Workerdiff --git a/include/pybind11/numpy.h b/include/pybind11/numpy.h 31*b6fb3261SAndroid Build Coastguard Workerindex 019f5688e7..d1ddc4a9db 100644 32*b6fb3261SAndroid Build Coastguard Worker--- a/include/pybind11/numpy.h 33*b6fb3261SAndroid Build Coastguard Worker+++ b/include/pybind11/numpy.h 34*b6fb3261SAndroid Build Coastguard Worker@@ -507,11 +507,21 @@ class dtype : public object { 35*b6fb3261SAndroid Build Coastguard Worker return detail::array_descriptor_proxy(m_ptr)->names != nullptr; 36*b6fb3261SAndroid Build Coastguard Worker } 37*b6fb3261SAndroid Build Coastguard Worker 38*b6fb3261SAndroid Build Coastguard Worker- /// Single-character type code. 39*b6fb3261SAndroid Build Coastguard Worker+ /// Single-character code for dtype's kind. 40*b6fb3261SAndroid Build Coastguard Worker+ /// For example, floating point types are 'f' and integral types are 'i'. 41*b6fb3261SAndroid Build Coastguard Worker char kind() const { 42*b6fb3261SAndroid Build Coastguard Worker return detail::array_descriptor_proxy(m_ptr)->kind; 43*b6fb3261SAndroid Build Coastguard Worker } 44*b6fb3261SAndroid Build Coastguard Worker 45*b6fb3261SAndroid Build Coastguard Worker+ /// Single-character for dtype's type. 46*b6fb3261SAndroid Build Coastguard Worker+ /// For example, ``float`` is 'f', ``double`` 'd', ``int`` 'i', and ``long`` 'd'. 47*b6fb3261SAndroid Build Coastguard Worker+ char char_() const { 48*b6fb3261SAndroid Build Coastguard Worker+ // Note: The signature, `dtype::char_` follows the naming of NumPy's 49*b6fb3261SAndroid Build Coastguard Worker+ // public Python API (i.e., ``dtype.char``), rather than its internal 50*b6fb3261SAndroid Build Coastguard Worker+ // C API (``PyArray_Descr::type``). 51*b6fb3261SAndroid Build Coastguard Worker+ return detail::array_descriptor_proxy(m_ptr)->type; 52*b6fb3261SAndroid Build Coastguard Worker+ } 53*b6fb3261SAndroid Build Coastguard Worker+ 54*b6fb3261SAndroid Build Coastguard Worker private: 55*b6fb3261SAndroid Build Coastguard Worker static object _dtype_from_pep3118() { 56*b6fb3261SAndroid Build Coastguard Worker static PyObject *obj = module_::import("numpy.core._internal") 57*b6fb3261SAndroid Build Coastguard Workerdiff --git a/tests/test_numpy_dtypes.cpp b/tests/test_numpy_dtypes.cpp 58*b6fb3261SAndroid Build Coastguard Workerindex b2e5e60756..9dece73ec3 100644 59*b6fb3261SAndroid Build Coastguard Worker--- a/tests/test_numpy_dtypes.cpp 60*b6fb3261SAndroid Build Coastguard Worker+++ b/tests/test_numpy_dtypes.cpp 61*b6fb3261SAndroid Build Coastguard Worker@@ -358,6 +358,14 @@ TEST_SUBMODULE(numpy_dtypes, m) { 62*b6fb3261SAndroid Build Coastguard Worker }); 63*b6fb3261SAndroid Build Coastguard Worker 64*b6fb3261SAndroid Build Coastguard Worker // test_dtype 65*b6fb3261SAndroid Build Coastguard Worker+ std::vector<const char *> dtype_names{ 66*b6fb3261SAndroid Build Coastguard Worker+ "byte", "short", "intc", "int_", "longlong", 67*b6fb3261SAndroid Build Coastguard Worker+ "ubyte", "ushort", "uintc", "uint", "ulonglong", 68*b6fb3261SAndroid Build Coastguard Worker+ "half", "single", "double", "longdouble", 69*b6fb3261SAndroid Build Coastguard Worker+ "csingle", "cdouble", "clongdouble", 70*b6fb3261SAndroid Build Coastguard Worker+ "bool_", "datetime64", "timedelta64", "object_" 71*b6fb3261SAndroid Build Coastguard Worker+ }; 72*b6fb3261SAndroid Build Coastguard Worker+ 73*b6fb3261SAndroid Build Coastguard Worker m.def("print_dtypes", []() { 74*b6fb3261SAndroid Build Coastguard Worker py::list l; 75*b6fb3261SAndroid Build Coastguard Worker for (const py::handle &d : { 76*b6fb3261SAndroid Build Coastguard Worker@@ -376,6 +384,18 @@ TEST_SUBMODULE(numpy_dtypes, m) { 77*b6fb3261SAndroid Build Coastguard Worker return l; 78*b6fb3261SAndroid Build Coastguard Worker }); 79*b6fb3261SAndroid Build Coastguard Worker m.def("test_dtype_ctors", &test_dtype_ctors); 80*b6fb3261SAndroid Build Coastguard Worker+ m.def("test_dtype_kind", [dtype_names]() { 81*b6fb3261SAndroid Build Coastguard Worker+ py::list list; 82*b6fb3261SAndroid Build Coastguard Worker+ for (auto& dt_name : dtype_names) 83*b6fb3261SAndroid Build Coastguard Worker+ list.append(py::dtype(dt_name).kind()); 84*b6fb3261SAndroid Build Coastguard Worker+ return list; 85*b6fb3261SAndroid Build Coastguard Worker+ }); 86*b6fb3261SAndroid Build Coastguard Worker+ m.def("test_dtype_char_", [dtype_names]() { 87*b6fb3261SAndroid Build Coastguard Worker+ py::list list; 88*b6fb3261SAndroid Build Coastguard Worker+ for (auto& dt_name : dtype_names) 89*b6fb3261SAndroid Build Coastguard Worker+ list.append(py::dtype(dt_name).char_()); 90*b6fb3261SAndroid Build Coastguard Worker+ return list; 91*b6fb3261SAndroid Build Coastguard Worker+ }); 92*b6fb3261SAndroid Build Coastguard Worker m.def("test_dtype_methods", []() { 93*b6fb3261SAndroid Build Coastguard Worker py::list list; 94*b6fb3261SAndroid Build Coastguard Worker auto dt1 = py::dtype::of<int32_t>(); 95*b6fb3261SAndroid Build Coastguard Workerdiff --git a/tests/test_numpy_dtypes.py b/tests/test_numpy_dtypes.py 96*b6fb3261SAndroid Build Coastguard Workerindex f56b776a40..0a5881e49d 100644 97*b6fb3261SAndroid Build Coastguard Worker--- a/tests/test_numpy_dtypes.py 98*b6fb3261SAndroid Build Coastguard Worker+++ b/tests/test_numpy_dtypes.py 99*b6fb3261SAndroid Build Coastguard Worker@@ -169,6 +169,9 @@ def test_dtype(simple_dtype): 100*b6fb3261SAndroid Build Coastguard Worker np.zeros(1, m.trailing_padding_dtype()) 101*b6fb3261SAndroid Build Coastguard Worker ) 102*b6fb3261SAndroid Build Coastguard Worker 103*b6fb3261SAndroid Build Coastguard Worker+ assert m.test_dtype_kind() == list("iiiiiuuuuuffffcccbMmO") 104*b6fb3261SAndroid Build Coastguard Worker+ assert m.test_dtype_char_() == list("bhilqBHILQefdgFDG?MmO") 105*b6fb3261SAndroid Build Coastguard Worker+ 106*b6fb3261SAndroid Build Coastguard Worker 107*b6fb3261SAndroid Build Coastguard Worker def test_recarray(simple_dtype, packed_dtype): 108*b6fb3261SAndroid Build Coastguard Worker elements = [(False, 0, 0.0, -0.0), (True, 1, 1.5, -2.5), (False, 2, 3.0, -5.0)] 109