diff options
Diffstat (limited to 'gnuradio-runtime/python/pmt/pmt_to_python.py')
-rw-r--r-- | gnuradio-runtime/python/pmt/pmt_to_python.py | 51 |
1 files changed, 40 insertions, 11 deletions
diff --git a/gnuradio-runtime/python/pmt/pmt_to_python.py b/gnuradio-runtime/python/pmt/pmt_to_python.py index e4797f9d44..3344eba163 100644 --- a/gnuradio-runtime/python/pmt/pmt_to_python.py +++ b/gnuradio-runtime/python/pmt/pmt_to_python.py @@ -63,13 +63,42 @@ def pmt_from_dict(p): d = pmt.dict_add(d, python_to_pmt(k), python_to_pmt(v)) return d -def numpy_to_blob(p): - p = p.view(numpy.uint8) - b = pmt.make_blob(len(p)) - pmt.blob_data(b)[:] = p - return b +numpy_mappings = { + numpy.dtype(numpy.float32): (pmt.init_f32vector, float, pmt.f32vector_elements, pmt.is_f32vector), + numpy.dtype(numpy.float64): (pmt.init_f64vector, float, pmt.f64vector_elements, pmt.is_f64vector), + numpy.dtype(numpy.complex64): (pmt.init_c32vector, complex, pmt.c32vector_elements, pmt.is_c32vector), + numpy.dtype(numpy.complex128): (pmt.init_c64vector, complex, pmt.c64vector_elements, pmt.is_c64vector), + numpy.dtype(numpy.int8): (pmt.init_s8vector, int, pmt.s8vector_elements, pmt.is_s8vector), + numpy.dtype(numpy.int16): (pmt.init_s16vector, int, pmt.s16vector_elements, pmt.is_s16vector), + numpy.dtype(numpy.int32): (pmt.init_s32vector, int, pmt.s32vector_elements, pmt.is_s32vector), +# numpy.dtype(numpy.int64): (pmt.init_s64vector, int, pmt.s64vector_elements, pmt.is_s64vector), + numpy.dtype(numpy.uint8): (pmt.init_u8vector, int, pmt.u8vector_elements, pmt.is_u8vector), + numpy.dtype(numpy.uint16): (pmt.init_u16vector, int, pmt.u16vector_elements, pmt.is_u16vector), + numpy.dtype(numpy.uint32): (pmt.init_u32vector, int, pmt.u32vector_elements, pmt.is_u32vector), +# numpy.dtype(numpy.uint64): (pmt.init_u64vector, int, pmt.u64vector_elements, pmt.is_u64vector), + numpy.dtype(numpy.byte): (pmt.init_u8vector, int, pmt.u8vector_elements, pmt.is_u8vector), +} -THE_TABLE = ( #python type, check pmt type, to python, from python +uvector_mappings = dict([ (numpy_mappings[key][3], (numpy_mappings[key][2], key)) for key in numpy_mappings ]) + +def numpy_to_uvector(numpy_array): + try: + mapping = numpy_mappings[numpy_array.dtype] + pc = map(mapping[1], numpy.ravel(numpy_array)) + return mapping[0](numpy_array.size, pc) + except KeyError: + raise ValueError("unsupported numpy array dtype for converstion to pmt %s"%(numpy_array.dtype)) + +def uvector_to_numpy(uvector): + match = None + for test_func in uvector_mappings.keys(): + if test_func(uvector): + match = uvector_mappings[test_func] + return numpy.array(match[0](uvector), dtype = match[1]) + else: + raise ValueError("unsupported uvector data type for conversion to numpy array %s"%(uvector)) + +type_mappings = ( #python type, check pmt type, to python, from python (None, pmt.is_null, lambda x: None, lambda x: pmt.PMT_NIL), (bool, pmt.is_bool, pmt.to_bool, pmt.from_bool), (str, pmt.is_symbol, pmt.symbol_to_string, pmt.string_to_symbol), @@ -81,18 +110,18 @@ THE_TABLE = ( #python type, check pmt type, to python, from python (tuple, pmt.is_tuple, pmt_to_tuple, pmt_from_tuple), (list, pmt.is_vector, pmt_to_vector, pmt_from_vector), (dict, pmt.is_dict, pmt_to_dict, pmt_from_dict), - (numpy.ndarray, pmt.is_blob, pmt.blob_data, numpy_to_blob), + (numpy.ndarray, pmt.is_uniform_vector, uvector_to_numpy, numpy_to_uvector), ) def pmt_to_python(p): - for python_type, pmt_check, to_python, from_python in THE_TABLE: + for python_type, pmt_check, to_python, from_python in type_mappings: if pmt_check(p): return to_python(p) - return p #give up, we return the same + raise ValueError("can't convert %s type to pmt (%s)"%(type(p),p)) def python_to_pmt(p): - for python_type, pmt_check, to_python, from_python in THE_TABLE: + for python_type, pmt_check, to_python, from_python in type_mappings: if python_type is None: if p == None: return from_python(p) elif isinstance(p, python_type): return from_python(p) - return p #give up, we return the same + raise ValueError("can't convert %s type to pmt (%s)"%(type(p),p)) |