【发布时间】:2021-09-15 18:06:07
【问题描述】:
我确定这在其他域中有一个名称(也许大约不同?)。
假设您想计算一个 numpy 数组中不同元素的数量,但您只关心低于某个阈值的数字,高于该阈值的数字,您只需返回它有多个 thresh 唯一条目。这对于您不关心有 10000 个条目只是可能有超过 10 个条目的高数量数组特别有用。
在编译语言中,这很容易快速实现。但是有哪些快速的实现暴露给 python?
天真的人可能会像这样尝试 numba:
@numba.jit(nopython=True)
def nunique_max_thresh(x, thresh=10):
seen = set()
for i in range(len(x)):
seen.add(x[i])
if len(seen) > thresh:
return thresh
return len(seen)
但不支持set 用法。
Cython 是一个选项,但我想知道这是否已经在某些库或 python 的其他地方完成。似乎瓶颈会做这种事情,但实际上并不存在。
https://bottleneck.readthedocs.io/en/latest/reference.html
例如,考虑这些类型的数组:
import string
import numpy as np
np.random.seed(0)
a = np.random.choice(list(string.ascii_letters), 1e7)
b = np.ones(int(1e7))
您只想知道这个数组是否有 10 个或更多的唯一值。不要使用这些是长度为一的字符串这一事实。
作为参考,这个运行。但可能不是最优的。
import numpy as np
cimport numpy as np
def nunique_truncated(np.ndarray x_in, np.int thresh=10):
seen = set()
for i in range(x_in.shape[0]):
seen.add(x_in[i])
if len(seen) >= thresh:
return thresh
【问题讨论】:
-
a) 如果这是用于 NLP 字数统计,则使用计数矢量化器来抑制停用词、映射标点符号和大小写 b) Bloom filters 存在
-
@smci 情况并非如此。我实际上只是在处理具有大量对象列的数据框。显然,如果它们是 pandas 分类,所有工作都已经完成。如果您想决定是否应以 dict/categorical 格式存储列,则会出现此类问题。
-
pandas包装 numpy 并在 Series 和 DataFrames 上有效地实现 unique 和 nunique。我建议这是你想要的。如果您仍然不喜欢它的性能,请以您正在谈论的任何规模发布一个易于处理的示例 (minimal reproducible example)。种子随机数据(例如自动生成的字符串)很好。顺便说一句,熊猫处理分类很好。除非您提供 MCVE 示例,否则此问题可能会被关闭为“寻求算法/pkg 建议”。 -
@mathtick: 不,K=1 是一个糟糕的测试选择,因为集合中只有 26 个元素,而且它们几乎都适合零内存,不像说 26^K 对于 K = 3 或 4。
-
Numba 支持 Set,但数据类型 '
a=a.view(np.int32)。
标签: python numpy unique distinct distinct-values