给定一个numpy数组,我希望删除相邻的重复非零值和所有零值。例如,对于像这样的数组:[0,0,1,1,1,2,2,0,1,3,3,3]
,我想将其转换为:[1,2,1,3]
。你知道怎么做吗?我只知道np.unique(arr)
但它会删除所有重复值并保持零值。提前谢谢!
答案 0 :(得分:4)
您可以使用groupby
中的itertools
方法结合列表理解来解决此问题:
from itertools import groupby
[k for k,g in groupby(a) if k!=0]
# [1,2,1,3]
数据:
a = [0,0,1,1,1,2,2,0,1,3,3,3]
答案 1 :(得分:3)
以这种方式:
In [62]: x
Out[62]: array([0, 0, 1, 1, 1, 2, 2, 0, 1, 3, 3, 3])
In [63]: selection = np.ones(len(x), dtype=bool)
In [64]: selection[1:] = x[1:] != x[:-1]
In [65]: selection &= x != 0
In [66]: x[selection]
Out[66]: array([1, 2, 1, 3])
答案 2 :(得分:1)
import numpy as np
a = np.array([0,0,1,1,1,2,2,0,1,3,3,3])
使用integer indexing选择非零元素
b = a[a.nonzero()]
>>> b
array([1, 1, 1, 2, 2, 1, 3, 3, 3])
>>>
将数组向左移动并在末尾添加一个元素,以将每个元素与其邻居进行比较。使用零,因为您知道b
中没有任何内容。
b1 = np.append(b[1:], 0)
>>> b1
array([1, 1, 2, 2, 1, 3, 3, 3, 0])
>>>
使用boolean indexing获取所需的值。
c = b[b != b1]
>>> c
array([1, 2, 1, 3])
>>>
答案 3 :(得分:0)
>>> import numpy as NP
>>> a = NP.array([0,0,1,1,1,2,2,0,1,3,3,3])
首先,删除零:
>>> idx = a==0
>>> a = a[-idx1]
>>> a
array([1, 1, 1, 2, 2, 1, 3, 3, 3])
现在删除连续的重复项
请注意 ediff1d(a)& a 具有不同的形状,因此 a1 不是结果; a的主要价值必须预先设定,正如我在下面的最后三行所做的那样)
>>> idx = NP.array(NP.ediff1d(a), dtype=bool)
>>> a1 = a[1:][idx]
array([2, 1, 3])
创建一个空数组来存储结果
>>> a0 = NP.empty(shape=(a1.shape[0]+1,))
>>> a0[0] = a[0]
>>> a0[1:] = a1
>>> a0
array([ 1, 2, 1, 3])