I have a 2D array
arr = np.array([
[ 1, 2, -1, -1],
[ 0, 1, -1, -1],
[ 3, 5, -1, -1],
[ 7, 8, -1, -1],
[ 6, 7, -1, -1],
[ 9, 11, -1, -1]])
Its elements are related to the indices of some other array. A -1 value represent "no index". I also have a translation of the elements in arr to some other value (indices of a different array) in the form of
trans = np.array([[ 0.],
[-1.],
[ 1.],
[-1.],
[ 2.],
[-1.],
[ 3.],
[-1.],
[ 4.],
[-1.],
[ 5.],
[-1.]])
Here the nth element of trans denotes the mapping of the element values in arr to the element value of trans. For example, a 8 in arr should be translated to a value of 4 (trans[8] == 4).
How can I apply trans to translate the values of arr?
CodePudding user response:
Just flatten trans, and index it with arr. Note that this results in the entries that were -1 in arr being translated to the last entry in trans. To fix this, you can manually assign -1 to all entries that were -1 in arr:
result = trans.flat[arr]
result[arr == -1] = -1
print(repr(result))
outputs
array([[-1., 1., -1., -1.],
[ 0., -1., -1., -1.],
[-1., -1., -1., -1.],
[-1., 4., -1., -1.],
[ 3., -1., -1., -1.],
[-1., -1., -1., -1.]])
Note that the result will have the dtype of trans.
CodePudding user response:
If you want to avoid doing unnecessary lookups into the last element of trans for the -1 entries in arr (as in this answer), you can instead create a copy of arr and then use similar indexing to only update the non--1 entries:
result = arr.copy()
has_index = arr != -1
result[has_index] = trans.flat[arr[has_index]].flat
print(repr(result))
which outputs
array([[-1, 1, -1, -1],
[ 0, -1, -1, -1],
[-1, -1, -1, -1],
[-1, 4, -1, -1],
[ 3, -1, -1, -1],
[-1, -1, -1, -1]])
Note that the result will have the dtype of arr.
