从列表中返回值!!= 2

时间:2017-09-12 07:04:46

标签: 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

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

4 个答案:

答案 0 :(得分: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])

现在,使用布尔索引:

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

答案 1 :(得分:2)

除了你可以手动添加的第一个元素(虽然根据Azat Ibrakov评论它没有任何意义)你可以使用#!/bin/ksh set -v date ./sleep.com& echo $? pid=$! echo $pid wait -n $pid child_exit=$? printf 'child exited with code %d\n' "$child_exit"

np.where

添加第一个元素:

a = np.array([1, 3, 5, 7, 14, 16, 18, 22, 28, 30, 32, 41, 43])
a[np.where(a[1:] - a[:-1] != 2)[0] + 1]

array([14, 22, 28, 41])

答案 2 :(得分:2)

您可以将boolean array indexing用于NumPy数组,使用np.diff来获取值之间的差异:

>>> my_list = [1, 3, 5, 7, 14, 16, 18, 22, 28, 30, 32, 41, 43]
>>> import numpy as np
>>> my_arr = np.array(my_list)
>>> my_mask = np.ones(my_arr.shape, dtype=bool)  # initial mask
>>> my_mask[1:] = np.diff(my_arr) != 2           # set all elements to False that have a difference of 2
>>> my_arr[my_mask]                              # mask the array
array([ 1, 14, 22, 28, 41])

答案 3 :(得分:0)

import numpy as np

my_list = [1, 3, 5, 7, 14, 16, 18, 22, 28, 30, 32, 41, 43]
a = np.array(my_list)
output = a[[True] + list(a[1:]-a[:-1] != 2)]
print(output)