以一定的最小频率过滤numpy数组中的元素
filtering elements in numpy array with a certain minimum frequency
我有一个包含 5000 个计数的数组,需要对其进行卡方检验。但是,该测试仅在每个值的预期频率 >5 时才有效。我使用 collections.Counter(x)
找到了数据集中每个值的频率,我可以看到有些值的频率为 1 或 2。
现在我想从我的原始数据集 x 中删除频率 <5 的任何值,但我不知道该怎么做。
删除这些点后,我需要创建预期泊松分布以用于卡方检验,但再次确保预期频率 >5。我已经使用 stats.poisson.rvs
进行了一些分布,但有没有办法确保频率始终高于 5?或者最好是创建发行版,然后完成我问题第一部分中的步骤?
将数组过滤到特定频率(例如 >5
)的一种方法是(a
是您的原始数组):
#this method assumes array a is consists of integers
a[np.in1d(a, np.where(np.bincount(a)>5)[0])]
另一种方式是:
#works for non-integer arrays
values, counts = np.unique(a, return_counts=True)
a[np.in1d(a, values[counts>5])]
我猜 bincount
解决方案更快。
我有一个包含 5000 个计数的数组,需要对其进行卡方检验。但是,该测试仅在每个值的预期频率 >5 时才有效。我使用 collections.Counter(x)
找到了数据集中每个值的频率,我可以看到有些值的频率为 1 或 2。
现在我想从我的原始数据集 x 中删除频率 <5 的任何值,但我不知道该怎么做。
删除这些点后,我需要创建预期泊松分布以用于卡方检验,但再次确保预期频率 >5。我已经使用 stats.poisson.rvs
进行了一些分布,但有没有办法确保频率始终高于 5?或者最好是创建发行版,然后完成我问题第一部分中的步骤?
将数组过滤到特定频率(例如 >5
)的一种方法是(a
是您的原始数组):
#this method assumes array a is consists of integers
a[np.in1d(a, np.where(np.bincount(a)>5)[0])]
另一种方式是:
#works for non-integer arrays
values, counts = np.unique(a, return_counts=True)
a[np.in1d(a, values[counts>5])]
我猜 bincount
解决方案更快。