Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Index the middle of a numpy array?

Tags:

python

numpy

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?

like image 960
keflavich Avatar asked Mar 06 '13 20:03

keflavich


2 Answers

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]]
like image 124
Cinder Avatar answered Oct 11 '22 15:10

Cinder


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)

like image 4
Meredith Hesketh Fortescue Avatar answered Oct 11 '22 14:10

Meredith Hesketh Fortescue