Python 将数组中的连续相等数设置为零

Python 将数组中的连续相等数设置为零,python,arrays,for-loop,if-statement,Python,Arrays,For Loop,If Statement,我有一个类似的数组 a = np.array( [ 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1] ) 我正在寻找一种将连续相等元素设置为零的方法: a_desired = np.array( [ 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] ) 到目前为止,我经历了一段相当不成功的时期,我尝试了一些简单的方法 for i in range(len(a)-1): if a[i+1] == a[i]: a[

我有一个类似的数组

a = np.array( [ 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1] )
我正在寻找一种将连续相等元素设置为零的方法:

a_desired =  np.array( [ 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] )
到目前为止,我经历了一段相当不成功的时期,我尝试了一些简单的方法

for i in range(len(a)-1):
    if a[i+1] == a[i]:
        a[i+1] = 0 
使用输出
[1 0 1 0 0 0 0 1 0 1]
,以及添加更多条件,如

for i in range(len(a)-1):
    if a[i+1] == a[i]:
        a[i+1] = 0 
    if a[i+1] != a[i] and a[i] == 0 and a[i+1] != a[i]:
        a[i+1] = 0 
它输出了
[1 0 0 0 0 0 0 0 0 0 0 0 0]
,但我似乎无法成功捕获实现此功能所需的所有条件

我们将非常感谢您的帮助

试试看:

import numpy as np

a = np.array([1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1])
a_desired = np.zeros(a.shape)

for i in range(len(a)-1, -1, -1):
    if a[i] == a[i-1] and i != 0:
        a_desired[i] = 0
    else:
        a_desired[i] = a[i]

print(a_desired)
输出:

[1. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 1.]
那么:

value_detected = 0
for i in range(len(a)):
    if value_detected:
        if a[i] == value_detected:
            a[i] = 0
        else:
            value_detected = a[i]
    else:
        if a[i]:
            value_detected = a[i]

print(a)
对于原始输入,输出:

[1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]
进一步测试,如果输入为:

a = [ 1, 1, 2, 2, 3, 3, 3, 1, 1, 1, 1, 0, 1]
那么输出是:

[1, 0, 2, 0, 3, 0, 0, 1, 0, 0, 0, 0, 1]

尝试numpy
xor

np.insert((np.logical_xor(a[:-1],a[1:])*a[1:],0,a[0])

我会这样做:

import numpy as np
a = np.array([1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1])
a[1:][a[:-1]==a[1:]] = 0
print(a)
输出:

[1 0 0 0 0 0 0 1 0 0 0 0 1]

我将不带最后一个元素的
a
与不带第一个元素的
a
进行比较,这样我就可以在可能被称为前一个元素和当前元素之间进行成对比较,从而得到
True
s和
False
s的数组,后者比
a
短1,然后我使用它作为掩码设置
0
其中
True
。请注意,我只在第一个元素之后修改
的一部分,因为第一个元素永远不会更改。

创建一个包含一个元素的列表,该元素将是输入列表的第一个元素

现在,只需从第2个元素开始遍历列表,并检查它是否等于前一个值

如果是,请附加0,否则,请附加该值

input_arr = [ 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1]
output_arr = [input_arr[0]]
for i in range(1, len(input_arr)):
  if input_arr[i]==input_arr[i-1]:
    output_arr.append(0)
  else:
    output_arr.append(input_arr[i])


print (output_arr)

从我这里,我首先复制原始数组,然后创建新的所需数组,如下所示:

new_a = a.copy()
for i in range(1, len(a)):        
    if a[i] == a[i-1]: new_a[i] = 0
print(new_a)

只是一个建议:不要修改正在迭代的数组。改为修改副本并迭代原始副本。我希望这个问题能对你有所帮助。我也很喜欢这个问题,尽管我还没有完全理解它。我相信它很快就会点击的。谢谢
new_a = a.copy()
for i in range(1, len(a)):        
    if a[i] == a[i-1]: new_a[i] = 0
print(new_a)