Revision: 21567
Author: gervandiepen
Date: Wed Feb 18 13:44:59 2015 UTC
Log: numpy array scalar is not iterable anymore
https://code.google.com/p/casacore/source/detail?r=21567
Modified:
/trunk/python/Converters/PycArrayNP.cc
/trunk/python/Converters/PycBasicData.h
/trunk/python/Converters/PycValueHolder.cc
/trunk/python/Converters/test/CMakeLists.txt
/trunk/python/Converters/test/tConvert.cc
/trunk/python/Converters/test/tConvert.py
=======================================
--- /trunk/python/Converters/PycArrayNP.cc Wed Oct 8 07:42:17 2014 UTC
+++ /trunk/python/Converters/PycArrayNP.cc Wed Feb 18 13:44:59 2015 UTC
@@ -75,22 +75,15 @@
if (!isImported()) return False;
loadAPI();
}
+ // No scalar if array scalar nor 0-dim array.
+ if (! PyArray_CheckScalar(obj_ptr)) {
+ return False;
+ }
+ // See if the object is a 0-dim array.
+ Bool is0dim = PyArray_Check(obj_ptr);
const int ntypes = 13;
// Define them in order of expected usage.
int types[ntypes] = {
-// NPY_INT,
-// NPY_LONG,
-// NPY_DOUBLE,
-// NPY_FLOAT,
-// NPY_CDOUBLE,
-// NPY_CFLOAT,
-// NPY_BOOL,
-// NPY_UINT,
-// NPY_ULONG,
-// NPY_SHORT,
-// NPY_USHORT,
-// NPY_BYTE,
-// NPY_UBYTE};
NPY_INT32,
NPY_INT64,
NPY_FLOAT32,
@@ -105,9 +98,16 @@
NPY_INT8,
NPY_UINT8};
for (int i=0; i<ntypes; ++i) {
- if (obj_ptr->ob_type ==
(PyTypeObject*)PyArray_TypeObjectFromType(types[i])) {
- type = types[i];
- return True;
+ if (is0dim) {
+ if (types[i] == PyArray_TYPE(obj_ptr)) {
+ type = types[i];
+ return True;
+ }
+ } else {
+ if (obj_ptr->ob_type ==
(PyTypeObject*)PyArray_TypeObjectFromType(types[i])) {
+ type = types[i];
+ return True;
+ }
}
}
return False;
@@ -119,28 +119,6 @@
if (! PycArrayScalarCheck(obj_ptr, type)) {
return TpOther;
}
-// switch (type) {
-// case NPY_BOOL:
-// return TpBool;
-// case NPY_SHORT:
-// case NPY_USHORT:
-// case NPY_INT:
-// case NPY_UINT:
-// return TpInt;
-// case NPY_FLOAT:
-// case NPY_DOUBLE:
-// return TpDouble;
-// case NPY_CFLOAT:
-// case NPY_CDOUBLE:
-// return TpDComplex;
-// default:
-// // NPY_LONG can be the same as NPY_INT, so cannot part of the
switch.
-// if (type==NPY_LONG || type==NPY_ULONG
-// || type==NPY_BYTE || type==NPY_UBYTE) {
-// return TpInt;
-// }
-// return TpOther;
-// }
switch (type) {
case NPY_BOOL:
return TpBool;
@@ -167,70 +145,74 @@
ValueHolder makeScalar (PyObject* obj_ptr, int type)
{
- char buffer[32];
- PyArray_ScalarAsCtype(obj_ptr, buffer);
-// switch (type) {
-// case NPY_BOOL:
-// return ValueHolder(*(::npy_bool*)buffer != 0);
-// case NPY_SHORT:
-// return ValueHolder(int(*(::npy_int16*)buffer));
-// case NPY_USHORT:
-// return ValueHolder(uint(*(::npy_uint16*)buffer));
-// case NPY_INT:
-// return ValueHolder(int(*(::npy_int32*)buffer));
-// case NPY_UINT:
-// return ValueHolder(uint(*(::npy_uint32*)buffer));
-// case NPY_FLOAT:
-// return ValueHolder(float(*(::npy_float32*)buffer));
-// case NPY_DOUBLE:
-// return ValueHolder(double(*(::npy_float64*)buffer));
-// case NPY_CFLOAT:
-// return ValueHolder(*(Complex*)buffer);
-// case NPY_CDOUBLE:
-// return ValueHolder(*(DComplex*)buffer);
-// default:
-// if (type == NPY_LONG) {
-// return ValueHolder(double(*(::npy_int64*)buffer));
-// } else if (type == NPY_ULONG) {
-// return ValueHolder(double(*(::npy_uint64*)buffer));
-// } else if (type == NPY_BYTE) {
-// return ValueHolder(double(*(::npy_int8*)buffer));
-// } else if (type == NPY_UBYTE) {
-// return ValueHolder(double(*(::npy_uint8*)buffer));
-// }
-// throw AipsError("invalid data type");
-// }
- switch (type) {
- case NPY_BOOL:
- return ValueHolder(*(::npy_bool*)buffer != 0);
- case NPY_INT8:
- return ValueHolder(int(*(::npy_int8*)buffer));
- case NPY_UINT8:
- return ValueHolder(uint(*(::npy_uint8*)buffer));
- case NPY_INT16:
- return ValueHolder(int(*(::npy_int16*)buffer));
- case NPY_UINT16:
- return ValueHolder(uint(*(::npy_uint16*)buffer));
- case NPY_INT32:
- return ValueHolder(int(*(::npy_int32*)buffer));
- case NPY_UINT32:
- return ValueHolder(uint(*(::npy_uint32*)buffer));
- case NPY_INT64:
- return ValueHolder(Int64(*(::npy_int64*)buffer));
- case NPY_UINT64:
- return ValueHolder(Int64(*(::npy_uint64*)buffer));
- case NPY_FLOAT32:
- return ValueHolder(float(*(::npy_float32*)buffer));
- case NPY_FLOAT64:
- return ValueHolder(double(*(::npy_float64*)buffer));
- case NPY_COMPLEX64:
- return ValueHolder(*(Complex*)buffer);
- case NPY_COMPLEX128:
- return ValueHolder(*(DComplex*)buffer);
- default:
- throw AipsError("invalid data type");
+ if (PyArray_Check(obj_ptr)) {
+ PyArrayObject* obj = (PyArrayObject*)obj_ptr;
+ switch (type) {
+ case NPY_BOOL:
+ return ValueHolder(*(::npy_bool*)(obj->data) != 0);
+ case NPY_INT8:
+ return ValueHolder(int(*(::npy_int8*)(obj->data)));
+ case NPY_UINT8:
+ return ValueHolder(uint(*(::npy_uint8*)(obj->data)));
+ case NPY_INT16:
+ return ValueHolder(int(*(::npy_int16*)(obj->data)));
+ case NPY_UINT16:
+ return ValueHolder(uint(*(::npy_uint16*)(obj->data)));
+ case NPY_INT32:
+ return ValueHolder(int(*(::npy_int32*)(obj->data)));
+ case NPY_UINT32:
+ return ValueHolder(uint(*(::npy_uint32*)(obj->data)));
+ case NPY_INT64:
+ return ValueHolder(Int64(*(::npy_int64*)(obj->data)));
+ case NPY_UINT64:
+ return ValueHolder(Int64(*(::npy_uint64*)(obj->data)));
+ case NPY_FLOAT32:
+ return ValueHolder(float(*(::npy_float32*)(obj->data)));
+ case NPY_FLOAT64:
+ return ValueHolder(double(*(::npy_float64*)(obj->data)));
+ case NPY_COMPLEX64:
+ return ValueHolder(*(Complex*)(obj->data));
+ case NPY_COMPLEX128:
+ return ValueHolder(*(DComplex*)(obj->data));
+ default:
+ break;
+ }
+ } else {
+ char buffer[32];
+ PyArray_ScalarAsCtype(obj_ptr, buffer);
+ switch (type) {
+ case NPY_BOOL:
+ return ValueHolder(*(::npy_bool*)buffer != 0);
+ case NPY_INT8:
+ return ValueHolder(int(*(::npy_int8*)buffer));
+ case NPY_UINT8:
+ return ValueHolder(uint(*(::npy_uint8*)buffer));
+ case NPY_INT16:
+ return ValueHolder(int(*(::npy_int16*)buffer));
+ case NPY_UINT16:
+ return ValueHolder(uint(*(::npy_uint16*)buffer));
+ case NPY_INT32:
+ return ValueHolder(int(*(::npy_int32*)buffer));
+ case NPY_UINT32:
+ return ValueHolder(uint(*(::npy_uint32*)buffer));
+ case NPY_INT64:
+ return ValueHolder(Int64(*(::npy_int64*)buffer));
+ case NPY_UINT64:
+ return ValueHolder(Int64(*(::npy_uint64*)buffer));
+ case NPY_FLOAT32:
+ return ValueHolder(float(*(::npy_float32*)buffer));
+ case NPY_FLOAT64:
+ return ValueHolder(double(*(::npy_float64*)buffer));
+ case NPY_COMPLEX64:
+ return ValueHolder(*(Complex*)buffer);
+ case NPY_COMPLEX128:
+ return ValueHolder(*(DComplex*)buffer);
+ default:
+ break;
+ }
}
-}
+ throw AipsError("invalid data type");
+ }
void register_convert_arrayscalars()
@@ -276,8 +258,8 @@
}
}
// Create the array from the shape.
- PyArrayObject* po = (PyArrayObject*)PyArray_SimpleNew
- (nd, &(newshp[0]), TypeConvTraits<T>::pyType());
+ PyArrayObject* po = (PyArrayObject*)
+ (PyArray_SimpleNew(nd, &(newshp[0]), TypeConvTraits<T>::pyType()));
if (po == 0) {
throw AipsError ("PycArray: failed to allocate python array-object");
}
=======================================
--- /trunk/python/Converters/PycBasicData.h Tue Jun 10 07:48:08 2014 UTC
+++ /trunk/python/Converters/PycBasicData.h Wed Feb 18 13:44:59 2015 UTC
@@ -35,6 +35,8 @@
#include <casa/BasicSL/String.h>
#include <casa/Arrays/IPosition.h>
#include <casa/Arrays/Vector.h>
+#include <casa/Utilities/Assert.h>
+#include <casa/Exceptions/Error.h>
#include <vector>
#include <map>
@@ -152,7 +154,7 @@
template <typename ContainerType, typename ValueType>
static void set_value(ContainerType& a, std::size_t i, ValueType
const& v)
{
- assert(a.size() == i);
+ AlwaysAssert(a.size() == i, AipsError);
a.push_back(v);
}
};
=======================================
--- /trunk/python/Converters/PycValueHolder.cc Tue Jun 10 07:48:08 2014 UTC
+++ /trunk/python/Converters/PycValueHolder.cc Wed Feb 18 13:44:59 2015 UTC
@@ -43,12 +43,13 @@
switch (vh.dataType()) {
case TpBool:
return boost::python::object(vh.asBool());
- case TpUChar:
case TpShort:
- case TpUShort:
case TpInt:
- case TpUInt:
return boost::python::object(vh.asInt());
+ case TpUChar:
+ case TpUShort:
+ case TpUInt:
+ return boost::python::object(vh.asuInt());
case TpInt64:
return boost::python::object(vh.asInt64());
case TpFloat:
@@ -176,6 +177,8 @@
return ValueHolder(from_python_sequence< Vector<Bool>,
casa_variable_capacity_policy >::make_container (obj_ptr));
case TpInt:
return ValueHolder(from_python_sequence< Vector<Int>,
casa_variable_capacity_policy >::make_container (obj_ptr));
+ case TpUInt:
+ return ValueHolder(from_python_sequence< Vector<uInt>,
casa_variable_capacity_policy >::make_container (obj_ptr));
case TpInt64:
return ValueHolder(from_python_sequence< Vector<Int64>,
casa_variable_capacity_policy >::make_container (obj_ptr));
case TpDouble:
=======================================
--- /trunk/python/Converters/test/CMakeLists.txt Tue Jun 10 07:48:08 2014
UTC
+++ /trunk/python/Converters/test/CMakeLists.txt Wed Feb 18 13:44:59 2015
UTC
@@ -6,6 +6,5 @@
add_library (${test} ${test}.cc)
SET_TARGET_PROPERTIES(${test} PROPERTIES PREFIX "_")
target_link_libraries (${test} casa_python
${Boost_PYTHON_LIBRARY_DEBUG} ${PYTHON_LIBRARIES})
- configure_file (${CMAKE_CURRENT_SOURCE_DIR}/${test}.py
${CMAKE_CURRENT_BINARY_DIR}/${test}.py COPYONLY)
- add_test (${test} ${CMAKE_SOURCE_DIR}/cmake/cmake_assay ./${test}.py)
+ add_test (${test} ${CMAKE_SOURCE_DIR}/cmake/cmake_assay ./${test})
endforeach (test)
=======================================
--- /trunk/python/Converters/test/tConvert.cc Tue Jun 10 07:48:08 2014 UTC
+++ /trunk/python/Converters/test/tConvert.cc Wed Feb 18 13:44:59 2015 UTC
@@ -88,10 +88,6 @@
{cout << "vecvecuInt " << in << endl; return in;}
IPosition testipos (const IPosition& in)
{cout << "IPos " << in << endl; return in;}
- Bool canusenumpy()
- {return PycCanUseNumpy();}
- Bool canusenumarray()
- {return PycCanUseNumarray();}
};
@@ -115,8 +111,6 @@
.def ("teststdvecuint", &TConvert::teststdvecuint)
.def ("teststdvecvecuint", &TConvert::teststdvecvecuint)
.def ("testipos", &TConvert::testipos)
- .def ("canusenumpy", &TConvert::canusenumpy)
- .def ("canusenumarray", &TConvert::canusenumarray)
;
}
=======================================
--- /trunk/python/Converters/test/tConvert.py Tue Jun 10 07:48:08 2014 UTC
+++ /trunk/python/Converters/test/tConvert.py Wed Feb 18 13:44:59 2015 UTC
@@ -77,6 +77,7 @@
print t.testvh (a);
print t.testvh(NUM.array([20.+10j]));
+ print t.testvh(NUM.array([21.]));
print t.testvh(NUM.array(21.));
print '>>>';
@@ -156,8 +157,9 @@
if __name__ == "__main__":
+ import numpy as NUM;
t = tConvert();
-
print "Doing numpy/array test ..."
- import numpy as NUM;
testnp();
+ # Do other tests.
+ dotest(t)