def unpack(self): """Unpack a POINTER(SAFEARRAY_...) into a Python tuple.""" dim = _safearray.SafeArrayGetDim(self) if dim == 1: num_elements = self._get_size(1) return tuple(self._get_elements_raw(num_elements)) elif dim == 2: # get the number of elements in each dimension rows, cols = self._get_size(1), self._get_size(2) # get all elements result = self._get_elements_raw(rows * cols) # transpose the result, because it is in VB order result = [tuple(result[r::rows]) for r in range(rows)] return tuple(result) else: lowerbounds = [ _safearray.SafeArrayGetLBound(self, d) for d in range(1, dim + 1) ] indexes = (c_long * dim)(*lowerbounds) upperbounds = [ _safearray.SafeArrayGetUBound(self, d) for d in range(1, dim + 1) ] return self._get_row(0, indexes, lowerbounds, upperbounds)
def unpack(self): """Unpack a POINTER(SAFEARRAY_...) into a Python tuple or ndarray.""" dim = _safearray.SafeArrayGetDim(self) if dim == 1: num_elements = self._get_size(1) result = self._get_elements_raw(num_elements) if safearray_as_ndarray: import numpy return numpy.asarray(result) return tuple(result) elif dim == 2: # get the number of elements in each dimension rows, cols = self._get_size(1), self._get_size(2) # get all elements result = self._get_elements_raw(rows * cols) # this must be reshaped and transposed because it is # flat, and in VB order if safearray_as_ndarray: import numpy return numpy.asarray(result).reshape((cols, rows)).T result = [tuple(result[r::rows]) for r in range(rows)] return tuple(result) else: lowerbounds = [_safearray.SafeArrayGetLBound(self, d) for d in range(1, dim+1)] indexes = (c_long * dim)(*lowerbounds) upperbounds = [_safearray.SafeArrayGetUBound(self, d) for d in range(1, dim+1)] row = self._get_row(0, indexes, lowerbounds, upperbounds) if safearray_as_ndarray: import numpy return numpy.asarray(row) return row
def _get_size(self, dim): "Return the number of elements for dimension 'dim'" return _safearray.SafeArrayGetUBound( self, dim) + 1 - _safearray.SafeArrayGetLBound(self, dim)