gpt4 book ai didi

python - 根据索引切割numpy数组

转载 作者:行者123 更新时间:2023-12-01 01:56:29 24 4
gpt4 key购买 nike

我有一个一维 numpy 数组。该数组中两个连续值之间的差值要么为 1,要么大于 1。我想针对每次差异大于 1 的情况将数组分割成多个部分。因此:

arr = numpy.array([77, 78, 79, 80, 90, 91, 92, 100, 101, 102, 103, 104])

应该变成

[array([77, 78, 79, 80]), array([90, 91, 92]), array([100, 101, 102, 103, 104])]

我有以下代码可以解决这个问题,但我感觉我在这里太复杂了。必须有一种更好/更Pythonic的方式。有人有更优雅的方法吗?

import numpy

def split(arr, cut_idxs):

empty_arr = []
for idx in range(-1, cut_idxs.shape[0]):
if idx == -1:
l, r = 0, cut_idxs[0]
elif (idx != -1) and (idx != cut_idxs.shape[0] - 1):
l, r = cut_idxs[idx] + 1, cut_idxs[idx + 1]
elif idx == cut_idxs.shape[0] - 1:
l, r = cut_idxs[-1] + 1, arr.shape[0]

empty_arr.append(arr[l:r + 1])

return empty_arr


arr = numpy.array([77, 78, 79, 80, 90, 91, 92, 100, 101, 102, 103, 104])
cuts = numpy.where(numpy.ediff1d(arr) > 2)[0]

print split(arr, cuts)

最佳答案

一种 Pythonic 方式是 -

np.split(arr, np.flatnonzero(np.diff(arr)>1)+1)

示例运行 -

In [10]: arr
Out[10]: array([ 77, 78, 79, 80, 90, 91, 92, 100, 101, 102, 103, 104])

In [11]: np.split(arr, np.flatnonzero(np.diff(arr)>1)+1)
Out[11]:
[array([77, 78, 79, 80]),
array([90, 91, 92]),
array([100, 101, 102, 103, 104])]

另一个带有切片 -

In [16]: cut_idx = np.r_[0,np.flatnonzero(np.diff(arr)>1)+1,len(arr)]
# Or np.flatnonzero(np.r_[True, np.diff(arr)>1, True])

In [17]: [arr[i:j] for i,j in zip(cut_idx[:-1],cut_idx[1:])]
Out[17]:
[array([77, 78, 79, 80]),
array([90, 91, 92]),
array([100, 101, 102, 103, 104])]

关于python - 根据索引切割numpy数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50120062/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com