1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
# -*- python -*- like file
''' Utilities for generic processing of return arrays from read
'''
import numpy as np
cimport numpy as cnp
cpdef object squeeze_element(cnp.ndarray arr):
''' Return squeezed element
The returned object may not be an ndarray - for example if we do
``arr.item`` to return a ``mat_struct`` object from a struct array '''
if not arr.size:
return np.array([])
cdef cnp.ndarray arr2 = np.squeeze(arr)
# We want to squeeze 0d arrays, unless they are record arrays
if arr2.ndim == 0 and arr2.dtype.kind != 'V':
return arr2.item()
return arr2
cpdef cnp.ndarray chars_to_strings(in_arr):
''' Convert final axis of char array to strings
Parameters
----------
in_arr : array
dtype of 'U1'
Returns
-------
str_arr : array
dtype of 'UN' where N is the length of the last dimension of
``arr``
'''
cdef cnp.ndarray arr = in_arr
cdef int ndim = arr.ndim
cdef cnp.npy_intp *dims = arr.shape
cdef cnp.npy_intp last_dim = dims[ndim-1]
cdef object new_dt_str, out_shape
if last_dim == 0: # deal with empty array case
# Started with U1 - which is OK for us
new_dt_str = arr.dtype.str
# So far we only know this is an empty array and that the last length is
# 0. The other dimensions could be non-zero. We set the next to last
# dimension to zero to signal emptiness
if ndim == 2:
out_shape = (0,)
else:
out_shape = in_arr.shape[:-2] + (0,)
else: # make new dtype string with N appended
new_dt_str = arr.dtype.str[:-1] + str(last_dim)
out_shape = in_arr.shape[:-1]
# Copy to deal with F ordered arrays
arr = np.ascontiguousarray(arr)
arr = arr.view(new_dt_str)
return arr.reshape(out_shape)
|