changeset 81:2e8b52a5e1b1

support NumPy string arrays
author Jaroslav Hajek <highegg@gmail.com>
date Mon, 21 Sep 2009 11:03:02 +0200
parents e1593574ee97
children 935d69473ebd
files ChangeLog python_to_octave.cc
diffstat 2 files changed, 24 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Fri Sep 18 13:15:34 2009 +0200
+++ b/ChangeLog	Mon Sep 21 11:03:02 2009 +0200
@@ -1,3 +1,8 @@
+2009-09-21  Jaroslav Hajek  <highegg@gmail.com>
+
+	* python_to_octave.cc (copy_pyarrobj_to_octarray_boot,
+	pyarr_to_octvalue): Support NumPy string arrays.
+
 2009-09-18  Jaroslav Hajek  <highegg@gmail.com>
 
 	* package/pytave.py: Safer check for interactive (mod_wsgi in
--- a/python_to_octave.cc	Fri Sep 18 13:15:34 2009 +0200
+++ b/python_to_octave.cc	Mon Sep 21 11:03:02 2009 +0200
@@ -187,6 +187,7 @@
 
 #ifdef HAVE_NUMPY
          ARRAYCASE(PyArray_BOOL, bool)
+         ARRAYCASE(PyArray_STRING, char)
 #endif
 
          ARRAYCASE(PyArray_OBJECT, PyObject *)
@@ -209,7 +210,7 @@
    }
 
    static void pyarr_to_octvalue(octave_value &octvalue,
-                                 const PyArrayObject *pyarr) {
+                                 PyArrayObject *pyarr) {
       dim_vector dims;
       switch (pyarr->nd) {
          case 0:
@@ -278,6 +279,7 @@
             pyarrobj_to_octvalueNd<ComplexNDArray>(octvalue, pyarr, dims);
             break;
          case PyArray_CHAR:
+         case_PyArray_CHAR:
             pyarrobj_to_octvalueNd<charNDArray>(octvalue, pyarr, dims);
             // FIXME: is the following needed?
             octvalue = octvalue.convert_to_str(true, true, '"');
@@ -286,6 +288,22 @@
          case PyArray_BOOL:
             pyarrobj_to_octvalueNd<boolNDArray>(octvalue, pyarr, dims);
             break;
+         case PyArray_STRING:
+            {
+               if (pyarr->descr->elsize == 1)
+                  goto case_PyArray_CHAR;
+               else {
+                  // Create a new descriptor of the data.
+                  PyArray_Descr *view_descr = PyArray_DescrFromType(PyArray_CHAR);
+                  // Create a new view of the NumPy array.
+                  PyArrayObject *view = (PyArrayObject *)PyArray_View (pyarr, view_descr, NULL);
+                  // Store in a handle to ensure proper destruction.
+                  handle<PyObject> view_handle (allow_null ((PyObject *)view));
+                  // Call recursively.
+                  pyarr_to_octvalue (octvalue, view);
+               }
+            }
+            break;
 #endif
          case PyArray_OBJECT:
             pyarrobj_to_octvalueNd<Cell>(octvalue, pyarr, dims);