在numpy中比较和翻转相邻值

时间:2017-07-21 23:57:52

标签: python numpy tensorflow scipy vectorization

我想比较(可能是多维的)bool numpy数组中的相邻值,这样如果一行中有相邻的True值,则只保留最左边的值,而其余的则保留被翻到False。例如:

Input:  [True, False, False, True]
Output: [True, False, False, True]

Input:  [True, True, False, True]
Output: [True, False, False, True]

Input:  [True, True, True, True]
Output: [True, False, False, False]

在NumPy,SciPy或TensorFlow中是否有一种有效(即矢量化)的方法?

2 个答案:

答案 0 :(得分:1)

您可以使用其移位版本计算数组的 logical_and ,如果两者都为真,则翻转值:

a[np.concatenate(([False], a[:-1])) & a] = False

测试

a = np.array([True, True, True, True])
a[np.concatenate(([False], a[:-1])) & a] = False       
a
# array([ True, False, False, False], dtype=bool)

a = np.array([True, True, False, True])    
a[np.concatenate(([False], a[:-1])) & a] = False    
a
# array([ True, False, False,  True], dtype=bool)

a = np.array([True, False, False, True])
a[np.concatenate(([False], a[:-1])) & a] = False 
a
# array([ True, False, False,  True], dtype=bool)

答案 1 :(得分:1)

对于一维阵列:

a = np.array([True, True, False, True])
b = np.diff(a)
a[1:] = np.logical_and(a[1:], b)

>>> a
array([ True, False, False,  True], dtype=bool)
>>>