Skip to content

Unable to do the difference between kind() and type() for dtype in numpy.h #2860

@bemichel

Description

@bemichel

Hi,
We are using pybind11 to give access to Python/C++ arrays in on a numerical project. For this, we are using the pybind11:array_t.

But, we would like to have access to type attribute in the PyArray_Descr in API C or the dtype.char on Python interface, but only the kind() method is available in the class pybin11::dtype in numpy.h.

The kind method gives only the "general" kind of the dtype, i.e.

    auto float32 = py::dtype::of<float>();
    std::cout << "float32.kind() = " << float32.kind() << std::endl; /// return 'f'
    auto float64 = py::dtype::of<double>();
    std::cout << "float64.kind() = " << float64.kind() << std::endl; /// return 'f'

So it is not possible to distinguish float from double, or int from long int.

Only by adding a new method in the pybind11::dtype::type() for exemple which returns the type attribute from PyArray_Descr, like the following

class dtype : public object {
  ....
    /// Single-character for dtype's kind (ex: float and double are 'f' or int and long int are 'i')
    char kind() const {
        return detail::array_descriptor_proxy(m_ptr)->kind;
    }

    /// Single-character for dtype's type (ex: float is 'f' and double 'd')
    char type() const {
        return detail::array_descriptor_proxy(m_ptr)->type;
    }
private:
  ....
};

It will be now possible to distinguish the effective type

    auto float32 = py::dtype::of<float>();
    std::cout << "float32.kind() = " << float32.kind() << std::endl; /// return 'f'
    std::cout << "float32.type() = " << float32.type() << std::endl; /// return 'f'
    auto float64 = py::dtype::of<double>();
    std::cout << "float64.kind() = " << float64.kind() << std::endl; /// return 'f'
    std::cout << "float64.type() = " << float64.type() << std::endl; /// return 'd'

Sorry, I am not sure if it is the good way to asking to add this little piece of code and/or if it is just possible ?
Should I create a merge request instead ?

Best regards,
Bertrand M.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions