如何在numpy数组中索引中间的值?

19
要对numpy数组的中间点进行索引,您可以这样做:
x = np.arange(10)
middle = x[len(x)/4:len(x)*3/4]

有没有一种简写方式来索引数组的中间部分?例如,最靠近len(x)/2n2n个元素?是否有一个漂亮的n维版本?


我认为除了你所创建的之外,没有更好的方法了。库中最相似的东西可能是 np.fft.fftshift,它将数组移动到索引0处。 - Jaime
是的,那是我考虑过的另一个选项,但它并不好很多:你需要执行 x = np.concatenate([np.fftshift[:n],np.fftshift[-n:]]) 或类似操作。 - keflavich
1
似乎将其制作成一个函数(例如,mid = lambda x: x[len(x)/4:len(x)*3/4])将是最简单的解决方案。 - cge
2
你可以在n维情况下使用切片对象:mid = lambda x: x[[slice(np.floor(d/4.),np.ceil(3*d/4.)) for d in x.shape]] - ali_m
@cge也许您应该把那个发表为答案。 - askewchan
2个回答

6

针对此问题,一个更为顺畅的方式是使用numpy的takeput函数。

若要获取数组中间的元素,可以使用put通过单索引来引用n维数组。同样,可以使用take从数组中获取值。

假设您的数组具有奇数个元素,则其中间元素将位于数组大小的一半处。在此处使用整数除法(//而不是/)将不会出现任何问题。

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)


5

正如cge所说,最简单的方法是将其转换为lambda函数,就像这样:

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

或者以n维方式表示:
middle = lambda x: x[[slice(np.floor(d/4.),np.ceil(3*d/4.)) for d in x.shape]]

3
快进4年,现在会产生一个警告:“VisibleDeprecationWarning:使用非整数而不是整数将来会导致错误”。 - kabammi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接