I couldn't find a better way to phrase the question. I have this array A
:
0.1, 0.0, -0.2, -0.1, 0.1, 0.5
I want to convert this to B
:
3, 2, 0, 1, 3, 4
Where each value of B
is the index of the original float value in np.unique(A)
.
Is there a convenient numpy (vectorized) way of doing it?
PS:
Another example, consider array C
:
[ 0.025, 0.025, -0.025, -0.025, -0.025, 0.075, -0.025, -0.075, 0.075, -0.075]
Result of np.unique(C)
:
array([-0.075, -0.05 , -0.025, 0. , 0.025, 0.05 , 0.075])
I want to change C
to D
:
[4, 4, 2, 2, 2, 6, 2, 0, 6]
Notice that -0.075
is the smallest value in C
so it gets value 0
in D
. Likewise, 0.075
is the largest value in C
so it gets the largest value 6
in D
.
CodePudding user response:
To return the indices which would reconstruct the array A
, i.e. the "inverse" of unique
, use numpy.unique
with the option return_inverse=True
:
import numpy as np
A = np.array([0.1, 0.0, -0.2, -0.1, 0.1, 0.5])
A_uniq, B = np.unique(A, return_inverse=True)
print(B) # [3 2 0 1 3 4]