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>) {},