gpt4 book ai didi

python - 删除频率低的项目

转载 作者:太空宇宙 更新时间:2023-11-03 13:40:45 25 4
gpt4 key购买 nike

让我们考虑长度为 n 的数组:

y=np.array([1,1,1,1,2,2,2,3,3,3,3,3,2,2,2,2,1,4,1,1,1])

和大小为 n x m 的矩阵 X

我想删除 y 的项目和 X 的行,对于它们 y 的对应值具有低频率。

我发现这会给我应该删除的 y 的值:

>>> items, count = np.unique(y, return_counts=True)
>>> to_remove = items[count < 3] # array([4])

这将删除项目:

>>> X=X[y != to_remove,:]
>>> y=y[y != to_remove]
array([1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1])

虽然上面的代码在只有一个标签要删除时有效,但当 y 有多个低频值时(即 y=np.array([1, 1,1,1,2,2,2,3,3,3,3,3,2,2,2,2,1,4,1,1,1,5,5,1,1]) 会导致 to_removearray([4, 5]):

>>> y[y != to_remove,:]
Traceback (most recent call last):
File "<input>", line 1, in <module>
IndexError: too many indices for array

如何以简洁的方式解决这个问题?

最佳答案

您可以在 np.unique 中使用额外的输出参数 return_inverse像这样 -

def unique_where(y):
_, idx, count = np.unique(y, return_inverse=True,return_counts=True)
return y[np.in1d(idx,np.where(count>=3)[0])]

def unique_arange(y):
_, idx, count = np.unique(y, return_inverse=True,return_counts=True)
return y[np.in1d(idx,np.arange(count.size)[count>=3])]

您可以使用 np.bincount假设 y 包含非负数,就像这样 -

def bincount_where(y):
counts = np.bincount(y)
return y[np.in1d(y,np.where(counts>=3)[0])]

def bincount_arange(y):
counts = np.bincount(y)
return y[np.in1d(y,np.arange(y.max())[counts>=3])]

运行时测试 -

本节将上面列出的三种方法与 @Ashwini Chaudhary's solution 中列出的方法相结合。 -

In [85]: y = np.random.randint(0,100000,50000)

In [90]: def unique_items_indexed(y): # @Ashwini Chaudhary's solution
...: items, count = np.unique(y, return_counts=True)
...: return y[np.in1d(y, items[count >= 3])]
...:

In [115]: %timeit unique_items_indexed(y)
10 loops, best of 3: 19.8 ms per loop

In [116]: %timeit unique_where(y)
10 loops, best of 3: 26.9 ms per loop

In [117]: %timeit unique_arange(y)
10 loops, best of 3: 26.5 ms per loop

In [118]: %timeit bincount_where(y)
100 loops, best of 3: 16.7 ms per loop

In [119]: %timeit bincount_arange(y)
100 loops, best of 3: 16.5 ms per loop

关于python - 删除频率低的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31762556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com