Source code for openmdao.util.array_util

""" Some useful array utilities. """

from six.moves import range
import numpy as np
from itertools import product

#def to_slice(idxs):
    #"""Convert an index array or list to a slice if possible. Otherwise,
    #return the index array or list.
    #"""
    #if isinstance(idxs, slice):
        #return idxs
    #elif isinstance(idxs, ndarray) or isinstance(idxs, list):
        #if len(idxs) == 1:
            #return slice(idxs[0], idxs[0]+1)
        #elif len(idxs) == 0:
            #return slice(0,0)

        #if isinstance(idxs, ndarray):
            #imin = idxs.min()
            #imax = idxs.max()
        #else:
            #imin = min(idxs)
            #imax = max(idxs)

        #stride = idxs[1]-idxs[0]

        #if stride == 0:
            #return idxs

        #for i in range(len(idxs)):
            #if i and idxs[i] - idxs[i-1] != stride:
                #return idxs

        #if stride < 0:
            ### negative strides cause some failures, so just do positive for now
            ##return slice(imax+1, imin, stride)
            #return idxs
        #else:
            #return slice(imin, imax+1, stride)
    #elif isinstance(idxs, int_types):
        #return slice(idxs, idxs+1)
    #else:
        #raise RuntimeError("can't convert indices of type '%s' to a slice" %
                           #str(type(idxs)))


[docs]def array_idx_iter(shape): """ Return an iterator over the indices into a n-dimensional array. Args ---- shape : tuple shape of the array. """ for p in product(*[range(s) for s in shape]): yield p
[docs]def evenly_distrib_idxs(num_divisions, arr_size): """ Given a number of divisions and the size of an array, chop the array up into pieces according to number of divisions, keeping the distribution of entries as even as possible. Args ---- num_divisions : int Number of parts to divide the array into. arr_size : int Number of entries in the array. Returns ------- tuple a tuple of (sizes, offsets), where sizes and offsets contain values for all divisions. """ base = arr_size / num_divisions leftover = arr_size % num_divisions sizes = np.ones(num_divisions, dtype="int") * base # evenly distribute the remainder across size-leftover procs, # instead of giving the whole remainder to one proc sizes[:leftover] += 1 offsets = np.zeros(num_divisions, dtype="int") offsets[1:] = np.cumsum(sizes)[:-1] return sizes, offsets