25 py::module_
np = py::module_::import(
"numpy");
28 check.pybind11 = py::dtype::of<T>();
35 get_dtype_check<std::int8_t>(
"int8"),
36 get_dtype_check<std::uint8_t>(
"uint8"),
37 get_dtype_check<std::int16_t>(
"int16"),
38 get_dtype_check<std::uint16_t>(
"uint16"),
39 get_dtype_check<std::int32_t>(
"int32"),
40 get_dtype_check<std::uint32_t>(
"uint32"),
41 get_dtype_check<std::int64_t>(
"int64"),
42 get_dtype_check<std::uint64_t>(
"uint64")
57 check.
name = py::type_id<T>();
58 check.size_cpp =
sizeof(T);
59 check.dtype = py::dtype::of<T>();
60 check.size_numpy = check.dtype.attr(
"itemsize").template cast<int>();
66 get_dtype_size_check<short>(),
67 get_dtype_size_check<unsigned short>(),
68 get_dtype_size_check<int>(),
69 get_dtype_size_check<unsigned int>(),
70 get_dtype_size_check<long>(),
71 get_dtype_size_check<unsigned long>(),
72 get_dtype_size_check<long long>(),
73 get_dtype_size_check<unsigned long long>(),
78 using arr = py::array;
79 using arr_t = py::array_t<uint16_t, 0>;
82 template<
typename... Ix>
arr data(
const arr& a, Ix... index) {
83 return arr(a.nbytes() - a.offset_at(index...), (
const uint8_t *) a.data(index...));
87 return arr(a.size() - a.index_at(index...), a.data(index...));
91 auto ptr = (uint8_t *) a.mutable_data(index...);
92 for (
py::ssize_t i = 0;
i < a.nbytes() - a.offset_at(index...);
i++)
93 ptr[
i] = (uint8_t) (ptr[
i] * 2);
98 auto ptr = a.mutable_data(index...);
111 #define def_index_fn(name, type) \
112 sm.def(#name, [](type a) { return name(a); }); \
113 sm.def(#name, [](type a, int i) { return name(a, i); }); \
114 sm.def(#name, [](type a, int i, int j) { return name(a, i, j); }); \
115 sm.def(#name, [](type a, int i, int j, int k) { return name(a, i, j, k); });
117 template <
typename T,
typename T2> py::handle
auxiliaries(T &&r, T2 &&r2) {
118 if (r.ndim() != 2)
throw std::domain_error(
"error: ndim != 2");
120 l.append(*r.data(0, 0));
121 l.append(*r2.mutable_data(0, 0));
122 l.append(r.data(0, 1) == r2.mutable_data(0, 1));
124 l.append(r.itemsize());
125 l.append(r.shape(0));
126 l.append(r.shape(1));
128 l.append(r.nbytes());
133 static int data_i = 42;
136 try { py::module_::import(
"numpy"); }
137 catch (...) {
return; }
140 py::class_<DtypeCheck>(sm,
"DtypeCheck")
144 return py::str(
"<DtypeCheck numpy={} pybind11={}>").format(
149 py::class_<DtypeSizeCheck>(sm,
"DtypeSizeCheck")
154 return py::str(
"<DtypeSizeCheck name='{}' size_cpp={} size_numpy={} dtype={}>").format(
155 self.
name,
self.size_cpp,
self.size_numpy,
self.
dtype);
160 sm.def(
"ndim", [](
const arr& a) {
return a.ndim(); });
161 sm.def(
"shape", [](
const arr& a) {
return arr(a.ndim(), a.shape()); });
162 sm.def(
"shape", [](
const arr& a,
py::ssize_t dim) {
return a.shape(dim); });
163 sm.def(
"strides", [](
const arr& a) {
return arr(a.ndim(), a.strides()); });
164 sm.def(
"strides", [](
const arr& a,
py::ssize_t dim) {
return a.strides(dim); });
165 sm.def(
"writeable", [](
const arr& a) {
return a.writeable(); });
166 sm.def(
"size", [](
const arr& a) {
return a.size(); });
167 sm.def(
"itemsize", [](
const arr& a) {
return a.itemsize(); });
168 sm.def(
"nbytes", [](
const arr& a) {
return a.nbytes(); });
169 sm.def(
"owndata", [](
const arr& a) {
return a.owndata(); });
186 sm.def(
"make_f_array", [] {
return py::array_t<float>({ 2, 2 }, { 4, 8 }); });
187 sm.def(
"make_c_array", [] {
return py::array_t<float>({ 2, 2 }, { 8, 4 }); });
190 sm.def(
"make_empty_shaped_array", [] {
return py::array(py::dtype(
"f"), {}, {}); });
192 sm.def(
"scalar_int", []() {
return py::array(py::dtype(
"i"), {}, {}, &data_i); });
195 sm.def(
"wrap", [](py::array a) {
198 {a.shape(), a.shape() + a.ndim()},
199 {a.strides(), a.strides() + a.ndim()},
207 int data[2] = { 1, 2 };
208 ArrayClass() {
py::print(
"ArrayClass()"); }
209 ~ArrayClass() {
py::print(
"~ArrayClass()"); }
211 py::class_<ArrayClass>(sm,
"ArrayClass")
213 .def(
"numpy_view", [](py::object &obj) {
215 auto &a = obj.cast<ArrayClass&>();
216 return py::array_t<int>({2}, {4}, a.data, obj);
221 sm.def(
"function_taking_uint64", [](uint64_t) { });
224 sm.def(
"isinstance_untyped", [](py::object yes, py::object no) {
225 return py::isinstance<py::array>(yes) && !py::isinstance<py::array>(no);
227 sm.def(
"isinstance_typed", [](py::object o) {
228 return py::isinstance<py::array_t<double>>(o) && !
py::isinstance<py::array_t<int>>(o);
232 sm.def(
"default_constructors", []() {
234 "array"_a=py::array(),
235 "array_t<int32>"_a=py::array_t<std::int32_t>(),
236 "array_t<double>"_a=py::array_t<double>()
239 sm.def(
"converting_constructors", [](py::object o) {
241 "array"_a=py::array(o),
242 "array_t<int32>"_a=py::array_t<std::int32_t>(o),
243 "array_t<double>"_a=py::array_t<double>(o)
248 sm.def(
"overloaded", [](py::array_t<double>) {
return "double"; });
249 sm.def(
"overloaded", [](py::array_t<float>) {
return "float"; });
250 sm.def(
"overloaded", [](py::array_t<int>) {
return "int"; });
251 sm.def(
"overloaded", [](py::array_t<unsigned short>) {
return "unsigned short"; });
252 sm.def(
"overloaded", [](py::array_t<long long>) {
return "long long"; });
253 sm.def(
"overloaded", [](py::array_t<std::complex<double>>) {
return "double complex"; });
254 sm.def(
"overloaded", [](py::array_t<std::complex<float>>) {
return "float complex"; });
256 sm.def(
"overloaded2", [](py::array_t<std::complex<double>>) {
return "double complex"; });
257 sm.def(
"overloaded2", [](py::array_t<double>) {
return "double"; });
258 sm.def(
"overloaded2", [](py::array_t<std::complex<float>>) {
return "float complex"; });
259 sm.def(
"overloaded2", [](py::array_t<float>) {
return "float"; });
264 sm.def(
"overloaded3", [](py::array_t<int>) {
return "int"; }, py::arg{}.noconvert());
265 sm.def(
"overloaded3", [](py::array_t<double>) {
return "double"; }, py::arg{}.noconvert());
269 sm.def(
"overloaded4", [](py::array_t<long long, 0>) {
return "long long"; });
270 sm.def(
"overloaded4", [](py::array_t<double, 0>) {
return "double"; });
274 sm.def(
"overloaded5", [](py::array_t<unsigned int>) {
return "unsigned int"; });
275 sm.def(
"overloaded5", [](py::array_t<double>) {
return "double"; });
279 sm.def(
"issue685", [](std::string) {
return "string"; });
280 sm.def(
"issue685", [](py::array) {
return "array"; });
281 sm.def(
"issue685", [](py::object) {
return "other"; });
284 sm.def(
"proxy_add2", [](py::array_t<double> a,
double v) {
285 auto r = a.mutable_unchecked<2>();
289 }, py::arg{}.noconvert(), py::arg());
291 sm.def(
"proxy_init3", [](
double start) {
292 py::array_t<double, py::array::c_style> a({ 3, 3, 3 });
293 auto r = a.mutable_unchecked<3>();
297 r(
i, j, k) = start++;
300 sm.def(
"proxy_init3F", [](
double start) {
301 py::array_t<double, py::array::f_style> a({ 3, 3, 3 });
302 auto r = a.mutable_unchecked<3>();
306 r(
i, j, k) = start++;
309 sm.def(
"proxy_squared_L2_norm", [](py::array_t<double> a) {
310 auto r = a.unchecked<1>();
313 sumsq += r[
i] * r(
i);
317 sm.def(
"proxy_auxiliaries2", [](py::array_t<double> a) {
318 auto r = a.unchecked<2>();
319 auto r2 = a.mutable_unchecked<2>();
323 sm.def(
"proxy_auxiliaries1_const_ref", [](py::array_t<double> a) {
324 const auto &r = a.unchecked<1>();
325 const auto &r2 = a.mutable_unchecked<1>();
326 return r(0) == r2(0) && r[0] == r2[0];
329 sm.def(
"proxy_auxiliaries2_const_ref", [](py::array_t<double> a) {
330 const auto &r = a.unchecked<2>();
331 const auto &r2 = a.mutable_unchecked<2>();
332 return r(0, 0) == r2(0, 0);
337 sm.def(
"proxy_add2_dyn", [](py::array_t<double> a,
double v) {
338 auto r = a.mutable_unchecked();
339 if (r.ndim() != 2)
throw std::domain_error(
"error: ndim != 2");
343 }, py::arg{}.noconvert(), py::arg());
344 sm.def(
"proxy_init3_dyn", [](
double start) {
345 py::array_t<double, py::array::c_style> a({ 3, 3, 3 });
346 auto r = a.mutable_unchecked();
347 if (r.ndim() != 3)
throw std::domain_error(
"error: ndim != 3");
351 r(
i, j, k) = start++;
354 sm.def(
"proxy_auxiliaries2_dyn", [](py::array_t<double> a) {
355 return auxiliaries(a.unchecked(), a.mutable_unchecked());
358 sm.def(
"array_auxiliaries2", [](py::array_t<double> a) {
364 sm.def(
"array_fail_test", []() {
return py::array(py::object()); });
365 sm.def(
"array_t_fail_test", []() {
return py::array_t<double>(py::object()); });
367 sm.def(
"array_fail_test_negative_size", []() {
int c = 0;
return py::array(-1, &c); });
371 sm.def(
"array_initializer_list1", []() {
return py::array_t<float>(1); });
372 sm.def(
"array_initializer_list2", []() {
return py::array_t<float>({ 1, 2 }); });
373 sm.def(
"array_initializer_list3", []() {
return py::array_t<float>({ 1, 2, 3 }); });
374 sm.def(
"array_initializer_list4", []() {
return py::array_t<float>({ 1, 2, 3, 4 }); });
378 sm.def(
"array_reshape2", [](py::array_t<double> a) {
379 const auto dim_sz = (
py::ssize_t)std::sqrt(a.size());
380 if (dim_sz * dim_sz != a.size())
381 throw std::domain_error(
"array_reshape2: input array total size is not a squared integer");
382 a.resize({dim_sz, dim_sz});
386 sm.def(
"array_resize3", [](py::array_t<double> a,
size_t N,
bool refcheck) {
387 a.resize({N, N, N}, refcheck);
392 sm.def(
"create_and_resize", [](
size_t N) {
393 py::array_t<double> a;
395 std::fill(a.mutable_data(), a.mutable_data() + a.size(), 42.);
399 sm.def(
"index_using_ellipsis", [](py::array a) {
404 sm.def(
"accept_double",
405 [](py::array_t<double, 0>) {},
407 sm.def(
"accept_double_forcecast",
408 [](py::array_t<double, py::array::forcecast>) {},
410 sm.def(
"accept_double_c_style",
411 [](py::array_t<double, py::array::c_style>) {},
413 sm.def(
"accept_double_c_style_forcecast",
414 [](py::array_t<double, py::array::forcecast | py::array::c_style>) {},
416 sm.def(
"accept_double_f_style",
417 [](py::array_t<double, py::array::f_style>) {},
419 sm.def(
"accept_double_f_style_forcecast",
420 [](py::array_t<double, py::array::forcecast | py::array::f_style>) {},
422 sm.def(
"accept_double_noconvert",
423 [](py::array_t<double, 0>) {},
425 sm.def(
"accept_double_forcecast_noconvert",
426 [](py::array_t<double, py::array::forcecast>) {},
428 sm.def(
"accept_double_c_style_noconvert",
429 [](py::array_t<double, py::array::c_style>) {},
431 sm.def(
"accept_double_c_style_forcecast_noconvert",
432 [](py::array_t<double, py::array::forcecast | py::array::c_style>) {},
434 sm.def(
"accept_double_f_style_noconvert",
435 [](py::array_t<double, py::array::f_style>) {},
437 sm.def(
"accept_double_f_style_forcecast_noconvert",
438 [](py::array_t<double, py::array::forcecast | py::array::f_style>) {},