/
mio_utils.pyx
60 lines (51 loc) · 1.84 KB
/
mio_utils.pyx
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
59
60
# -*- python -*- like file
''' Utilities for generic processing of return arrays from read
'''
import numpy as np
cimport numpy as cnp
cnp.import_array()
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([], dtype=arr.dtype)
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)