Skip to content

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

Open
@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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions