从列表中返回值!!= 2

Imr*_*ran 3 python arrays numpy

我有一个列表,例如 my_list = [1, 3, 5, 7, 14, 16, 18, 22, 28, 30, 32, 41, 43]

我想要一个函数,它将返回列表中的所有值,其中该值与前一个值之间的差值不等于2,例如,函数将返回[1, 14, 22, 28, 41]上面的列表.请注意,第一个值my_list将始终显示为输出的第一个值.输入列表的长度不为零,最大为100.

到目前为止我有这个:

def get_output(array):
    start = [array[0]]
    for i in range(1, len(array)-1):
        if (array[i] - array[i-1]) != 2:
            start.append(array[i])

    return start
Run Code Online (Sandbox Code Playgroud)

是否有更快的矢量化解决方案,请记住我将这个函数应用于数千个输入数组?

jua*_*aga 5

为了避免使用低效np.concat,使用np.ediff1代替np.diff,这需要一个to_begin参数预先挂起到结果:

>>> my_list = [1, 3, 5, 7, 14, 16, 18, 22, 28, 30, 32, 41, 43]
>>> arr = np.array(my_list)
>>> np.ediff1d(arr, to_begin=0)
array([0, 2, 2, 2, 7, 2, 2, 4, 6, 2, 2, 9, 2])
Run Code Online (Sandbox Code Playgroud)

所以现在,使用布尔索引:

>>> arr[np.ediff1d(arr, to_begin=0) != 2]
array([ 1, 14, 22, 28, 41])
Run Code Online (Sandbox Code Playgroud)

  • 或者只是使用布尔索引:`arr [np.ediff1d(arr,to_begin = 0)!= 2]` (2认同)