Akhilesh Arkala
Akhilesh Arkala

Reputation: 37

Extract the index value from array

I have an array A1 with shape 2x3 & list A2. I want to extract the index value of array from the list.

Example

A1 = [[0, 1, 2]
     [3, 4, 5]] # Shape 2 rows & 3 columns

A2 = [0,1,2,3,4,5]

Now, I want to write a code to access the an element's index in Array A1

Expected Output

A2[3] = (1,0) #(1 = row & 0 = column) Index of No.3 in A1

Please help me. Thank you

Upvotes: 1

Views: 1659

Answers (2)

Pierre D
Pierre D

Reputation: 26271

There is some ambiguity in the question. Are we looking for the indices of elements by value, or by order?

Unravel an ordinal index

Assuming that the values in A1 are not important (i.e. this is not a search of certain values, but really finding the index corresponding to a location), you can use unravel_index for that.

Example:

>>> np.unravel_index(3, A1.shape)
(1, 0)

Or, on the whole A2 in one shot:

>>> np.unravel_index(A2, np.array(A1).shape)
(array([0, 0, 0, 1, 1, 1]), array([0, 1, 2, 0, 1, 2]))

which you may prefer as a list of tuples ("transpose" of the above):

>>> list(zip(*np.unravel_index(A2, np.array(A1).shape)))
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)]

Search for a value

If, instead, you are searching for values, e.g., where in A1 are there values equal to A2[i], then, like in @dc_Bita98's answer:

>>> tuple(np.argwhere(A1 == A2[3]).squeeze())
(1, 0)

If you want all the locations in one shot, you need to do something to handle the fact that the shapes are different. Say also, for sake of illustration, that:

A3 = np.array([9, 1, 0, 1])

Then, either:

>>> i, j, k = np.where(A1 == A3[:, None, None])
>>> out = np.full(A3.shape, (,), dtype=object)
>>> out[i] = list(zip(j, k))
>>> out.tolist()
[None, (1, 0), (2, 0), (3, 0)]

which clearly indicates that the first value (9) was not found, and where to find the others.

Or:

>>> [tuple(np.argwhere(A1 == v).squeeze()) for v in A3]
[None, (0, 1), (0, 0), (0, 1)]

Upvotes: 3

dcfg
dcfg

Reputation: 891

If you can use numpy, check out argwhere

a1 = np.array([[0,1,2],[3,4,5]])
a2 = [0,1,2,3,4,5]
a3 = np.argwhere(a1 == a2[3]).squeeze() # -> (1, 0)

Upvotes: 1

Related Questions