在数组中选择N个均匀间隔的元素,包括first和last

JDS*_*JDS 10 python arrays numpy

我有一个任意长度的数组,我想选择它的N个元素,均匀地间隔开(大约,N可能是偶数,数组长度可能是素数等),包括第一个arr[0]元素和最后一个arr[len-1]元素.

例:

>>> arr = np.arange(17)
>>> arr
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16])
Run Code Online (Sandbox Code Playgroud)

然后我想创建一个像下面这样的函数numElems来在数组中均匀地间隔开,它必须包含第一个和最后一个元素:

GetSpacedElements(numElems = 4)
>>> returns 0, 5, 11, 16
Run Code Online (Sandbox Code Playgroud)

这有意义吗?

我试过arr[0:len:numElems](即使用数组start:stop:skip符号)和一些细微的变化,但我没有得到我在这里寻找的东西:

>>> arr[0:len:numElems]
array([ 0,  4,  8, 12, 16])
Run Code Online (Sandbox Code Playgroud)

要么

>>> arr[0:len:numElems+1]
array([ 0,  5, 10, 15])
Run Code Online (Sandbox Code Playgroud)

我并不完全关心中间元素是什么,只要它们间隔均匀,偏离指数1即可.但是获得正确数量的元素(包括索引零和最后一个索引)是至关重要的.

希望有人能帮我找到快速的单行程,谢谢!

cs9*_*s95 12

要获得均匀间隔索引的列表,请使用np.linspace:

idx = np.round(np.linspace(0, len(arr) - 1, numElems)).astype(int)
Run Code Online (Sandbox Code Playgroud)

接下来,索引返回arr以获取相应的值:

arr[idx]
Run Code Online (Sandbox Code Playgroud)

在转换为整数之前始终使用舍入.在内部,提供dtype参数时的linspace调用astype.因此,此方法等同于:

# this simply truncates the non-integer part
idx = np.linspace(0, len(array) - 1, numElems).astype(int)
idx = np.linspace(0, len(arr) - 1, numElems, dtype='int')
Run Code Online (Sandbox Code Playgroud)

  • 如果 numElements 小于或等于 len(arr),则不能保证 idx 列表中不会有任何重复项。在我看来这是一个缺陷 (2认同)