我正在寻找一种执行以下操作的快速方法: 说我有一个数组
X = np.array([1,1,1,2,2,2,2,2,3,3,1,1,0,0,0,5])
我不是连续查找元素的简单频率。因此,前1个重复3次,而不是2 5次,重复3 2次,依此类推。因此,如果freq
是我的函数,则为:
Y = freq(X)
Y = np.array([[1,3],[2,5],[3,2],[1,2],[0,3],[5,1]])
例如,我可以这样编写循环:
def freq(X):
i=0
Y=[]
while i<len(X):
el = X[i]
el_count=0
while X[i]==el:
el_count +=1
i+=1
if i==len(X):
break
Y.append(np.array([el,el_count]))
return np.array(Y)
我正在寻找一种更快更好的方法。 谢谢!
答案 0 :(得分:2)
这是提高性能的一种NumPy方法-
In [14]: m = np.r_[True,X[:-1]!=X[1:],True]
In [21]: counts = np.diff(np.flatnonzero(m))
In [22]: unq = X[m[:-1]]
In [23]: np.c_[unq,counts]
Out[23]:
array([[1, 3],
[2, 5],
[3, 2],
[1, 2],
[0, 3],
[5, 1]])
答案 1 :(得分:1)
您可以使用itertools.groupby
来执行操作,而无需调用numpy
。
import itertools
X = [1,1,1,2,2,2,2,2,3,3,1,1,0,0,0,5]
Y = [(x, len(list(y))) for x, y in itertools.groupby(X)]
print(Y)
# [(1, 3), (2, 5), (3, 2), (1, 2), (0, 3), (5, 1)]