Numpy:基于满足条件

时间:2018-05-14 02:03:26

标签: python arrays numpy

我正在尝试将一个numpy数组拆分成符合某种条件的块。例如,给定a = np.array([ 1, 2, 3, 4, 10, 9, 8, 7, 7, 7, 8, 9, 10])返回[array([3, 4]), array([7, 7, 7])],因为这些块符合条件np.logical_and(a>2,a<8)

我提出的解决方案是有效的,但是因为我首先应用条件来分割数组然后再选择我想要的结果,所以感觉很尴尬。

import numpy as np
a = np.array([ 1,  2,  3,  4, 10,  9,  8,  7,  7,  7,  8,  9, 10])
cond = np.logical_and(a>2,a<8)
splits = np.split(a,np.where(np.diff(cond))[0]+1)
# this yields [array([1, 2]), array([3, 4]), array([10,  9,  8]), array([7, 7, 7]), array([ 8,  9, 10])]
result = [x for x in splits if np.logical_and(x>2,x<8).any()]
# [array([3, 4]), array([7, 7, 7])]

有没有办法对两者都应用相同的条件,这样如果我想改变条件,我可以在代码中改变一次而不是两次?或者我过于复杂的事情,有更简单,更pythonic,这样做的方式?

1 个答案:

答案 0 :(得分:4)

这是一个选项,在拆分之前子集数组以消除for循环

cond = (a > 2) & (a < 8)
np.split(a[cond], np.where(np.diff(np.where(cond)[0]) > 1)[0] + 1)
# [array([3, 4]), array([7, 7, 7])]