Description
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.