comparison VectorConversion.cpp @ 41:55fcd0e3e513

Fix handling of 2D NumPy arrays
author Chris Cannam
date Wed, 26 Nov 2014 18:08:53 +0000
parents fa3f80d4e340
children 36cc53aad853
comparison
equal deleted inserted replaced
40:fa3f80d4e340 41:55fcd0e3e513
189 setValueError(msg); 189 setValueError(msg);
190 return v; 190 return v;
191 } 191 }
192 192
193 /// check strides (useful if array is not continuous) 193 /// check strides (useful if array is not continuous)
194 size_t strides = *((size_t*) PyArray_STRIDES(pyArray)); 194 size_t *strideptr = (size_t*) PyArray_STRIDES(pyArray);
195
196 cerr << "dims = " << PyArray_DIMS(pyArray)[0] << "x" << PyArray_DIMS(pyArray)[1] << ", strides = " << strides << endl;
197 195
198 /// convert the array 196 /// convert the array
199 for (int i = 0; i < PyArray_DIMS(pyArray)[0]; ++i) { 197 for (int i = 0; i < PyArray_DIMS(pyArray)[0]; ++i) {
200 198
201 vector<float> vv; 199 vector<float> vv;
202 200
203 switch (descr->type_num) { 201 switch (descr->type_num) {
204 202
205 case NPY_FLOAT : // dtype='float32' 203 case NPY_FLOAT : // dtype='float32'
206 vv = PyArray_Convert<float,float>(PyArray_GETPTR2(pyArray, i, 0),PyArray_DIMS(pyArray)[1],strides); 204 vv = PyArray_Convert<float,float>(PyArray_GETPTR2(pyArray, i, 0),PyArray_DIMS(pyArray)[1],strideptr[1]);
207 break; 205 break;
208 case NPY_DOUBLE : // dtype='float64' 206 case NPY_DOUBLE : // dtype='float64'
209 vv = PyArray_Convert<float,double>(PyArray_GETPTR2(pyArray, i, 0),PyArray_DIMS(pyArray)[1],strides); 207 vv = PyArray_Convert<float,double>(PyArray_GETPTR2(pyArray, i, 0),PyArray_DIMS(pyArray)[1],strideptr[1]);
210 break; 208 break;
211 case NPY_INT : // dtype='int' 209 case NPY_INT : // dtype='int'
212 vv = PyArray_Convert<float,int>(PyArray_GETPTR2(pyArray, i, 0),PyArray_DIMS(pyArray)[1],strides); 210 vv = PyArray_Convert<float,int>(PyArray_GETPTR2(pyArray, i, 0),PyArray_DIMS(pyArray)[1],strideptr[1]);
213 break; 211 break;
214 case NPY_LONG : // dtype='long' 212 case NPY_LONG : // dtype='long'
215 vv = PyArray_Convert<float,long>(PyArray_GETPTR2(pyArray, i, 0),PyArray_DIMS(pyArray)[1],strides); 213 vv = PyArray_Convert<float,long>(PyArray_GETPTR2(pyArray, i, 0),PyArray_DIMS(pyArray)[1],strideptr[1]);
216 break; 214 break;
217 default : 215 default :
218 string msg = "Unsupported value type in NumPy array object."; 216 string msg = "Unsupported value type in NumPy array object.";
219 cerr << "VectorConversion::PyArray_To_FloatVector failed (value type = " << descr->type_num << "). Error: " << msg << endl; 217 cerr << "VectorConversion::PyArray_To_FloatVector failed (value type = " << descr->type_num << "). Error: " << msg << endl;
220 setValueError(msg); 218 setValueError(msg);