1
1
#pragma once
2
- #include < Python.h>
2
+ #include " ./../pyref.hpp"
3
+
4
+ #include < numpy/arrayobject.h>
3
5
4
6
namespace cpp2py {
5
7
@@ -8,6 +10,18 @@ namespace cpp2py {
8
10
template <> struct py_converter <std::complex<double >> {
9
11
static PyObject *c2py (std::complex<double > x) { return PyComplex_FromDoubles (x.real (), x.imag ()); }
10
12
static std::complex<double > py2c (PyObject *ob) {
13
+
14
+ if (PyArray_CheckScalar (ob)) {
15
+ // Convert NPY Scalar Type to Builtin Type
16
+ pyref py_builtin = PyObject_CallMethod (ob, " item" , NULL );
17
+ if (PyComplex_Check (py_builtin)) {
18
+ auto r = PyComplex_AsCComplex (py_builtin);
19
+ return {r.real , r.imag };
20
+ } else {
21
+ return PyFloat_AsDouble (py_builtin);
22
+ }
23
+ }
24
+
11
25
if (PyComplex_Check (ob)) {
12
26
auto r = PyComplex_AsCComplex (ob);
13
27
return {r.real , r.imag };
@@ -16,6 +30,10 @@ namespace cpp2py {
16
30
}
17
31
static bool is_convertible (PyObject *ob, bool raise_exception) {
18
32
if (PyComplex_Check (ob) || PyFloat_Check (ob) || PyLong_Check (ob)) return true ;
33
+ if (PyArray_CheckScalar (ob)) {
34
+ pyref py_arr = PyArray_FromScalar (ob, NULL );
35
+ if (PyArray_ISINTEGER ((PyObject*)py_arr) or PyArray_ISFLOAT ((PyObject*)py_arr) or PyArray_ISCOMPLEX ((PyObject*)py_arr)) return true ;
36
+ }
19
37
if (raise_exception) { PyErr_SetString (PyExc_TypeError, " Cannot convert to complex" ); }
20
38
return false ;
21
39
}
0 commit comments