23 #include "openPMD/Datatype.hpp" 25 #include <pybind11/numpy.h> 26 #include <pybind11/pybind11.h> 27 #include <pybind11/stl.h> 31 #include <type_traits> 35 inline Datatype dtype_from_numpy(pybind11::dtype
const dt)
39 if (dt.char_() == pybind11::dtype(
"b").char_())
40 if constexpr (std::is_signed_v<char>)
42 return Datatype::CHAR;
46 return Datatype::SCHAR;
48 else if (dt.char_() == pybind11::dtype(
"B").char_())
49 if constexpr (std::is_unsigned_v<char>)
51 return Datatype::CHAR;
55 return Datatype::UCHAR;
57 else if (dt.char_() == pybind11::dtype(
"short").char_())
58 return Datatype::SHORT;
59 else if (dt.char_() == pybind11::dtype(
"intc").char_())
61 else if (dt.char_() == pybind11::dtype(
"int_").char_())
62 return Datatype::LONG;
63 else if (dt.char_() == pybind11::dtype(
"longlong").char_())
64 return Datatype::LONGLONG;
65 else if (dt.char_() == pybind11::dtype(
"ushort").char_())
66 return Datatype::USHORT;
67 else if (dt.char_() == pybind11::dtype(
"uintc").char_())
68 return Datatype::UINT;
69 else if (dt.char_() == pybind11::dtype(
"uint").char_())
70 return Datatype::ULONG;
71 else if (dt.char_() == pybind11::dtype(
"ulonglong").char_())
72 return Datatype::ULONGLONG;
73 else if (dt.char_() == pybind11::dtype(
"clongdouble").char_())
74 return Datatype::CLONG_DOUBLE;
75 else if (dt.char_() == pybind11::dtype(
"cdouble").char_())
76 return Datatype::CDOUBLE;
77 else if (dt.char_() == pybind11::dtype(
"csingle").char_())
78 return Datatype::CFLOAT;
79 else if (dt.char_() == pybind11::dtype(
"longdouble").char_())
80 return Datatype::LONG_DOUBLE;
81 else if (dt.char_() == pybind11::dtype(
"double").char_())
82 return Datatype::DOUBLE;
83 else if (dt.char_() == pybind11::dtype(
"single").char_())
84 return Datatype::FLOAT;
85 else if (dt.char_() == pybind11::dtype(
"bool").char_())
86 return Datatype::BOOL;
90 throw std::runtime_error(
91 std::string(
"Datatype '") + dt.char_() +
92 std::string(
"' not known in 'dtype_from_numpy'!"));
107 if (fmt.find(
"?") != std::string::npos)
109 else if (fmt.find(
"b") != std::string::npos)
111 else if (fmt.find(
"h") != std::string::npos)
113 else if (fmt.find(
"i") != std::string::npos)
115 else if (fmt.find(
"l") != std::string::npos)
117 else if (fmt.find(
"q") != std::string::npos)
119 else if (fmt.find(
"B") != std::string::npos)
121 else if (fmt.find(
"H") != std::string::npos)
123 else if (fmt.find(
"I") != std::string::npos)
125 else if (fmt.find(
"L") != std::string::npos)
127 else if (fmt.find(
"Q") != std::string::npos)
128 return DT::ULONGLONG;
129 else if (fmt.find(
"Zf") != std::string::npos)
131 else if (fmt.find(
"Zd") != std::string::npos)
133 else if (fmt.find(
"Zg") != std::string::npos)
134 return DT::CLONG_DOUBLE;
135 else if (fmt.find(
"f") != std::string::npos)
137 else if (fmt.find(
"d") != std::string::npos)
139 else if (fmt.find(
"g") != std::string::npos)
140 return DT::LONG_DOUBLE;
142 throw std::runtime_error(
143 "dtype_from_bufferformat: Unknown " 148 inline pybind11::dtype dtype_to_numpy(
Datatype const dt)
159 return pybind11::dtype(
"b");
163 return pybind11::dtype(
"B");
171 return pybind11::dtype(
"short");
175 return pybind11::dtype(
"intc");
179 return pybind11::dtype(
"int_");
182 case DT::VEC_LONGLONG:
183 return pybind11::dtype(
"longlong");
187 return pybind11::dtype(
"ushort");
191 return pybind11::dtype(
"uintc");
195 return pybind11::dtype(
"uint");
198 case DT::VEC_ULONGLONG:
199 return pybind11::dtype(
"ulonglong");
203 return pybind11::dtype(
"single");
208 return pybind11::dtype(
"double");
210 case DT::LONG_DOUBLE:
211 case DT::VEC_LONG_DOUBLE:
212 return pybind11::dtype(
"longdouble");
216 return pybind11::dtype(
"csingle");
219 case DT::VEC_CDOUBLE:
220 return pybind11::dtype(
"cdouble");
222 case DT::CLONG_DOUBLE:
223 case DT::VEC_CLONG_DOUBLE:
224 return pybind11::dtype(
"clongdouble");
227 return pybind11::dtype(
"bool");
231 throw std::runtime_error(
232 "dtype_to_numpy: Invalid Datatype '{...}'!");
Datatype dtype_from_bufferformat(std::string const &fmt)
Return openPMD::Datatype from py::buffer_info::format.
Definition: Numpy.hpp:98
Datatype
Concrete datatype of an object available at runtime.
Definition: Datatype.hpp:45
Public definitions of openPMD-api.