mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-23 05:35:13 +00:00
Add dtype(names, offsets, formats, itemsize) ctor
This commit is contained in:
parent
fc5620afa6
commit
d77bc8c343
@ -125,6 +125,15 @@ public:
|
|||||||
m_ptr = from_args(pybind11::str(format)).release().ptr();
|
m_ptr = from_args(pybind11::str(format)).release().ptr();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dtype(list names, list formats, list offsets, size_t itemsize) {
|
||||||
|
dict args;
|
||||||
|
args["names"] = names;
|
||||||
|
args["formats"] = formats;
|
||||||
|
args["offsets"] = offsets;
|
||||||
|
args["itemsize"] = int_(itemsize);
|
||||||
|
m_ptr = from_args(args).release().ptr();
|
||||||
|
}
|
||||||
|
|
||||||
static dtype from_args(object args) {
|
static dtype from_args(object args) {
|
||||||
// This is essentially the same as calling np.dtype() constructor in Python
|
// This is essentially the same as calling np.dtype() constructor in Python
|
||||||
PyObject *ptr = nullptr;
|
PyObject *ptr = nullptr;
|
||||||
@ -184,12 +193,11 @@ private:
|
|||||||
|
|
||||||
list names, formats, offsets;
|
list names, formats, offsets;
|
||||||
for (auto& descr : field_descriptors) {
|
for (auto& descr : field_descriptors) {
|
||||||
names.append(descr.name); formats.append(descr.format); offsets.append(descr.offset);
|
names.append(descr.name);
|
||||||
|
formats.append(descr.format);
|
||||||
|
offsets.append(descr.offset);
|
||||||
}
|
}
|
||||||
auto args = dict();
|
return dtype(names, formats, offsets, itemsize());
|
||||||
args["names"] = names; args["formats"] = formats; args["offsets"] = offsets;
|
|
||||||
args["itemsize"] = (int_) itemsize();
|
|
||||||
return dtype::from_args(args);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -324,7 +332,7 @@ DECL_FMT(std::complex<double>, NPY_CDOUBLE_, "complex128");
|
|||||||
static PYBIND11_DESCR name() { return _("S") + _<N>(); } \
|
static PYBIND11_DESCR name() { return _("S") + _<N>(); } \
|
||||||
static pybind11::dtype dtype() { \
|
static pybind11::dtype dtype() { \
|
||||||
PYBIND11_DESCR fmt = _("S") + _<N>(); \
|
PYBIND11_DESCR fmt = _("S") + _<N>(); \
|
||||||
return pybind11::dtype::from_args(pybind11::str(fmt.text())); \
|
return pybind11::dtype(fmt.text()); \
|
||||||
} \
|
} \
|
||||||
static const char *format() { PYBIND11_DESCR s = _<N>() + _("s"); return s.text(); }
|
static const char *format() { PYBIND11_DESCR s = _<N>() + _("s"); return s.text(); }
|
||||||
template <size_t N> struct npy_format_descriptor<char[N]> { DECL_CHAR_FMT };
|
template <size_t N> struct npy_format_descriptor<char[N]> { DECL_CHAR_FMT };
|
||||||
@ -356,18 +364,15 @@ struct npy_format_descriptor<T, typename std::enable_if<is_pod_struct<T>::value>
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void register_dtype(std::initializer_list<field_descriptor> fields) {
|
static void register_dtype(std::initializer_list<field_descriptor> fields) {
|
||||||
auto args = dict();
|
list names, formats, offsets;
|
||||||
list names { }, offsets { }, formats { };
|
|
||||||
for (auto field : fields) {
|
for (auto field : fields) {
|
||||||
if (!field.descr)
|
if (!field.descr)
|
||||||
pybind11_fail("NumPy: unsupported field dtype");
|
pybind11_fail("NumPy: unsupported field dtype");
|
||||||
names.append(str(field.name));
|
names.append(str(field.name));
|
||||||
offsets.append(int_(field.offset));
|
|
||||||
formats.append(field.descr);
|
formats.append(field.descr);
|
||||||
|
offsets.append(int_(field.offset));
|
||||||
}
|
}
|
||||||
args["names"] = names; args["offsets"] = offsets; args["formats"] = formats;
|
dtype_() = pybind11::dtype(names, formats, offsets, sizeof(T)).release().ptr();
|
||||||
args["itemsize"] = int_(sizeof(T));
|
|
||||||
dtype_() = pybind11::dtype::from_args(args).release().ptr();
|
|
||||||
|
|
||||||
// There is an existing bug in NumPy (as of v1.11): trailing bytes are
|
// There is an existing bug in NumPy (as of v1.11): trailing bytes are
|
||||||
// not encoded explicitly into the format string. This will supposedly
|
// not encoded explicitly into the format string. This will supposedly
|
||||||
|
Loading…
Reference in New Issue
Block a user