我有一个列表,例如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
是否有更快的矢量化解决方案,请记住我会将此函数应用于数千个输入数组?
答案 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)