Source code for bw2calc.indexing

# -*- coding: utf-8 -*-
from __future__ import print_function, unicode_literals
from eight import *

from .utils import MAX_INT_32
import itertools
import numpy as np


[docs] def index_with_arrays(array_from, array_to, mapping): """Map ``array_from`` keys to ``array_to`` values using the dictionary ``mapping``. Turns the keys and values of mapping into index arrays. This is needed to take the ``flow``, ``input``, and ``output`` columns, which can be arbitrarily large integers, and transform them to matrix indices, which start from zero. Here is an example: .. code-block:: python import numpy as np a_f = np.array((1, 2, 3, 4)) a_t = np.zeros(4) mapping = {1: 5, 2: 6, 3: 7, 4: 8} index_with_arrays(a_f, a_t, mapping) # => a_t is now [5, 6, 7, 8] Args: * *array_from* (array): 1-dimensional integer numpy array. * *array_to* (array): 1-dimensional integer numpy array. * *mapping* (dict): Dictionary that links ``mapping`` indices to ``row`` or ``col`` indices, e.g. ``{34: 3}``. Operates in place. Doesn't return anything.""" keys = np.array(list(mapping.keys())) values = np.array(list(mapping.values())) if keys.min() < 0: raise ValueError("Keys must be positive integers") index_array = np.zeros(keys.max() + 1) + MAX_INT_32 index_array[keys] = values mask = array_from <= keys.max() array_to[:] = MAX_INT_32 array_to[mask] = index_array[array_from[mask]]
[docs] def index_with_searchsorted(array_from, array_to): """Build a dictionary from the sorted, unique elements of an array, and map this dictionary from ``array_from`` to ``array_to``. Adapted from http://stackoverflow.com/questions/3403973/fast-replacement-of-values-in-a-numpy-array. Here is an example: .. code-block:: python import numpy as np array = np.array((4, 8, 6, 2, 4)) output = np.zeros(5) index_with_searchsorted(array, output) # => returns {2: 0, 4: 1, 6: 2, 8: 3} # and `output` is [1, 3, 2, 0, 1] ``array_from`` and ``array_to`` are arrays of integers. Returns a dictionary that maps the sorted, unique elements of ``array_from`` to integers starting with zero.""" unique = np.unique(array_from) idx = np.searchsorted(unique, array_from) array_to[:] = idx return dict(zip( (int(x) for x in unique), itertools.count() ))