Index the middle of a numpy array?

17,302

Solution 1

as cge said, the simplest way is by turning it into a lambda function, like so:

x = np.arange(10)
middle = lambda x: x[len(x)/4:len(x)*3/4]

or the n-dimensional way is:

middle = lambda x: x[[slice(np.floor(d/4.),np.ceil(3*d/4.)) for d in x.shape]]

Solution 2

Late, but for everyone else running into this issue: A much smoother way is to use numpy's take or put.

To address the middle of an array you can use put to index an n-dimensional array with a single index. Same for getting values from an array with take

Assuming your array has an odd number of elements, the middle of the array will be at half of it's size. By using an integer division (// instead of /) you won't get any problems here.

import numpy as np

arr = np.array([[0, 1, 2],
                [3, 4, 5],
                [6, 7, 8]])

# put a value to the center 
np.put(arr, arr.size // 2, 999)
print(arr)

# take a value from the center
center = np.take(arr, arr.size // 2)
print(center)

Share:
17,302

Related videos on Youtube

keflavich
Author by

keflavich

I'm an astrophysicist using primarily python.

Updated on September 14, 2022

Comments

  • keflavich
    keflavich over 1 year

    To index the middle points of a numpy array, you can do this:

    x = np.arange(10)
    middle = x[len(x)/4:len(x)*3/4]
    

    Is there a shorthand for indexing the middle of the array? e.g., the n or 2n elements closes to len(x)/2? Is there a nice n-dimensional version of this?

    • cge
      cge about 11 years
      It seems like just making this a function (eg, mid = lambda x: x[len(x)/4:len(x)*3/4]) would be the simplest solution.
    • ali_m
      ali_m about 11 years
      You can use slice objects for the n-dimensional case: mid = lambda x: x[[slice(np.floor(d/4.),np.ceil(3*d/4.)) for d in x.shape]]
  • kabammi
    kabammi over 6 years
    fast forward 4 years, and this now produces a warning "VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future".