Niku
Niku

Reputation: 15

Finding an index numpy python

Consider a NumPy array of shape (8, 8).

My Question: What is the index (x,y) of the 50th element?

Note: For counting the elements go row-wise.

Example, in array A, where A = [[1, 5, 9], [3, 0, 2]] the 5th element would be '0'.

Can someone explain how to find the general solution for this and, what would be the solution for this specific problem?

Upvotes: 0

Views: 2625

Answers (4)

Rohit Kumar Mishra
Rohit Kumar Mishra

Reputation: 1

First need to create a 88 order 2d numpy array using np.array and range.Reshape created array as 88 In the output you check index of 50th element is [6,1]

    import numpy as np
    arr = np.array(range(1,(8*8)+1)).reshape(8,8)
    print(arr[6,1])

output will be 50

or you can do it in generic way as well by the help of numpy where method.

    import numpy as np
    def getElementIndex(array: np.array, element):
        elementIndex = np.where(array==element)
        return f'[{elementIndex[0][0]},{elementIndex[1][0]}]'

    def getXYOrderNumberArray(x:int, y:int):
        return np.array(range(1,(x*y)+1)).reshape(x,y)

    arr = getXYOrderNumberArray(8,8)
    print(getElementIndex(arr,50))

Upvotes: 0

evenodd
evenodd

Reputation: 317

In a NumPy array a of shape (r, c) (just like a list of lists), the n-th element is

a[(n-1) // c][(n-1) % c],

assuming that n starts from 1 as in your example. It has nothing to do with r. Thus, when r = c = 8 and n = 50, the above formula is exactly

a[6][1].

Let me show more using your example:

from numpy import *

a = array([[1, 5, 9], [3, 0, 2]])
r = len(a)
c = len(a[0])
print(f'(r, c) = ({r}, {c})')
print(f'Shape: {a.shape}')
for n in range(1, r * c + 1):
    print(f'Element {n}: {a[(n-1) // c][(n-1) % c]}')

Below is the result:

(r, c) = (2, 3)
Shape: (2, 3)
Element 1: 1
Element 2: 5
Element 3: 9
Element 4: 3
Element 5: 0
Element 6: 2

Upvotes: 3

Michael Szczesny
Michael Szczesny

Reputation: 5036

You can use unravel_index to find the coordinates corresponding to the index of the flattened array. Usually np.arrays start with index 0, you have to adjust for this.

import numpy as np

a = np.arange(64).reshape(8,8)
np.unravel_index(50-1, a.shape)

Out:

(6, 1)

Upvotes: 4

Esi
Esi

Reputation: 487

numpy.ndarray.faltten(a) returns a copy of the array a collapsed into one dimension. And please note that the counting starts from 0, therefore, in your example 0 is the 4th element and 1 is the 0th.

import numpy as np
arr = np.array([[1, 5, 9], [3, 0, 2]])
fourth_element = np.ndarray.flatten(arr)[4]

or

fourth_element = arr.flatten()[4]

the same for 8x8 matrix.

Upvotes: 1

Related Questions