def _export_array(data, c_variable): if c_variable.data_type != _lib.harp_type_string: # NB. The _ffi.buffer() method as well as the numpy.frombuffer() method provide a view on the C array; neither # method incurs a copy. The numpy.copyto() method also works if the source array is a scalar, i.e. not an # instance of numpy.ndarray. size = c_variable.num_elements * _lib.harp_get_size_for_type( c_variable.data_type) shape = data.shape if isinstance(data, numpy.ndarray) else () c_data_buffer = _ffi.buffer(c_variable.data.ptr, size) c_data = numpy.reshape( numpy.frombuffer(c_data_buffer, dtype=_get_py_data_type(c_variable.data_type)), shape) numpy.copyto(c_data, data, casting="safe") elif isinstance(data, numpy.ndarray): for index, element in enumerate(data.flat): if _lib.harp_variable_set_string_data_element( c_variable, index, _encode_string(element)) != 0: raise CLibraryError() else: assert (c_variable.num_elements == 1) if _lib.harp_variable_set_string_data_element( c_variable, 0, _encode_string(data)) != 0: raise CLibraryError()
def _import_array(c_data_type, c_num_elements, c_data): if c_data_type == _lib.harp_type_string: data = numpy.empty((c_num_elements,), dtype=numpy.object) for i in range(c_num_elements): # NB. The _ffi.string() method returns a copy of the C string. data[i] = _decode_string(_ffi.string(c_data.string_data[i])) return data # NB. The _ffi.buffer() method, as well as the numpy.frombuffer() method, provide a view on the C array; neither # method incurs a copy. c_data_buffer = _ffi.buffer(c_data.ptr, c_num_elements * _lib.harp_get_size_for_type(c_data_type)) return numpy.copy(numpy.frombuffer(c_data_buffer, dtype=_get_py_data_type(c_data_type)))
def _import_array(c_data_type, c_num_elements, c_data): if c_data_type == _lib.harp_type_string: data = numpy.empty((c_num_elements, ), dtype=numpy.object) for i in range(c_num_elements): # NB. The _ffi.string() method returns a copy of the C string. data[i] = _decode_string(_ffi.string(c_data.string_data[i])) return data # NB. The _ffi.buffer() method, as well as the numpy.frombuffer() method, provide a view on the C array; neither # method incurs a copy. c_data_buffer = _ffi.buffer( c_data.ptr, c_num_elements * _lib.harp_get_size_for_type(c_data_type)) return numpy.copy( numpy.frombuffer(c_data_buffer, dtype=_get_py_data_type(c_data_type)))
def _export_array(data, c_variable): if c_variable.data_type != _lib.harp_type_string: # NB. The _ffi.buffer() method as well as the numpy.frombuffer() method provide a view on the C array; neither # method incurs a copy. The numpy.copyto() method also works if the source array is a scalar, i.e. not an # instance of numpy.ndarray. size = c_variable.num_elements * _lib.harp_get_size_for_type(c_variable.data_type) shape = data.shape if isinstance(data, numpy.ndarray) else () c_data_buffer = _ffi.buffer(c_variable.data.ptr, size) c_data = numpy.reshape(numpy.frombuffer(c_data_buffer, dtype=_get_py_data_type(c_variable.data_type)), shape) numpy.copyto(c_data, data, casting="safe") elif isinstance(data, numpy.ndarray): for index, element in enumerate(data.flat): if _lib.harp_variable_set_string_data_element(c_variable, index, _encode_string(element)) != 0: raise CLibraryError() else: assert(c_variable.num_elements == 1) if _lib.harp_variable_set_string_data_element(c_variable, 0, _encode_string(data)) != 0: raise CLibraryError()