gpt4 book ai didi

python - 返回输入的每个特征的计数数组

转载 作者:太空宇宙 更新时间:2023-11-04 09:50:18 26 4
gpt4 key购买 nike

我有一个整数标签数组,我想确定每个标签的数量,并将这些值存储在与输入大小相同的数组中。这可以通过以下循环来完成:

def counter(labels):
sizes = numpy.zeros(labels.shape)
for num in numpy.unique(labels):
mask = labels == num
sizes[mask] = numpy.count_nonzero(mask)
return sizes

输入:

array = numpy.array([
[0, 1, 2, 3],
[0, 1, 1, 3],
[3, 1, 3, 1]])

counter() 返回:

array([[ 2.,  5.,  1.,  4.],
[ 2., 5., 5., 4.],
[ 4., 5., 4., 5.]])

但是,对于具有许多唯一标签的大型数组,在我的例子中有 60,000 个,这需要相当长的时间。这是复杂算法的第一步,我不能在这一步上花费超过 30 秒的时间。是否已经存在可以实现此目的的功能?如果不是,我怎样才能加快现有循环?

最佳答案

方法 #1

这是一个使用 np.unique 的-

_, tags, count = np.unique(labels, return_counts=1, return_inverse=1)
sizes = count[tags]

方法 #2

labels 中使用正数,使用np.bincount 更简单高效-

sizes = np.bincount(labels)[labels]

运行时测试

设置 60,000 唯一正数和两组这样的长度 100,0001000,000 是计时的。

第 1 组:

In [192]: np.random.seed(0)
...: labels = np.random.randint(0,60000,(100000))

In [193]: %%timeit
...: sizes = np.zeros(labels.shape)
...: for num in np.unique(labels):
...: mask = labels == num
...: sizes[mask] = np.count_nonzero(mask)
1 loop, best of 3: 2.32 s per loop

In [194]: %timeit np.bincount(labels)[labels]
1000 loops, best of 3: 376 µs per loop

In [195]: 2320/0.376 # Speedup figure
Out[195]: 6170.212765957447

第 2 组:

In [196]: np.random.seed(0)
...: labels = np.random.randint(0,60000,(1000000))

In [197]: %%timeit
...: sizes = np.zeros(labels.shape)
...: for num in np.unique(labels):
...: mask = labels == num
...: sizes[mask] = np.count_nonzero(mask)
1 loop, best of 3: 43.6 s per loop

In [198]: %timeit np.bincount(labels)[labels]
100 loops, best of 3: 5.15 ms per loop

In [199]: 43600/5.15 # Speedup figure
Out[199]: 8466.019417475727

关于python - 返回输入的每个特征的计数数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48044980/

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