计算numpy数组中某个值范围内元素的出现频率?

67up9zun  于 2023-02-23  发布在  其他
关注(0)|答案(4)|浏览(170)

我在这个问题上花了太多时间,我想我应该只花几分钟就能解决这个问题。我有一个数组i,里面有大约400个1 - 21之间的数字。我想计算1 - 21中每个数字在数据中的频率。我还想将这个范围限制在1 - 16之间,并排除16以上的数字。
这就是我要做的,但是它非常笨拙,效率也很低,我觉得一定有办法可以大大缩短这个过程,我需要能够得到频率输出,并将它们放在一个名为nvals的排序数组中,我可以用它来进行后续计算。

i=bin_numDM+(bin_numF-1)*fbins

ones= 0
twos=0
threes=0
fours=0
fives=0
sixes=0
sevens=0
eights=0
nines=0
tens=0
elevens=0
twelves=0
thirteens=0
fourteens=0
fifteens=0
sixteens=0

for item in i:
    if item ==1:
        ones = ones + 1
    if item==2:
        twos=twos+1
    if item==3:
        threes=threes+1
    if item==4:
        fours=fours+1
    if item==5:
        fives=fives+1
    if item==6:
        sixes=sixes+1
    if item==7:
        sevens=sevens+1
    if item==8:
        eights=eights+1
    if item==9:
        nines=nines+1
    if item==10:
        tens=tens+1
    if item==11:
        elevens=elevens+1
    if item==12:
        twelves=twelves+1
    if item==13:
        thirteens=thirteens+1
    if item==14:
        fourteens=fourteens+1
    if item==15:
        fifteens=fifteens+1
    if item==16:
        sixteens=sixteens+1 
nvals=[ones,twos,threes,fours,fives,sixes,sevens,eights,nines,tens,elevens,twelves,thirteens,fourteens,fifteens,sixteens]

我也试过:

unique, frequency=np.unique(i,return_counts=True)
count=np.asarray((unique,frequency))

这是可行的,但我一辈子都想不出如何将i值限制在1 - 16之间。
有什么建议吗?:)

ewm0tg9j

ewm0tg9j1#

你所寻找的答案取决于你是否想使用库。如果你使用numpy数组,那么

val, count = np.unique(arr, return_counts=True)

否则,您应该避免为每个可能的结果调用if。相反,您可以使用字典来存储条目示例:

l = [1,2,2,3,5]
solution = {i:0 for i in range(16)}
for item in l:
    if item in solution:
        solution[item] += 1
wko9yo5t

wko9yo5t2#

可以先删除要排除的元素,然后再进行计数。

import numpy as np

i = np.arange(1, 22)

filtered_i = np.delete(i, np.where(i > 16))

unique, frequency=np.unique(filtered_i, return_counts=True)
count=np.asarray((unique, frequency))
smtd7mpg

smtd7mpg3#

使用numpy.unique

import numpy as np
i = np.random.randint(1,22,400)
unique, counts = np.unique(i, return_counts=True)
ocurrences = dict(zip(unique, counts))
result = {k:v for k, v in occurences.items() if 0<k<17}
zf9nrax1

zf9nrax14#

下面是几种等效的方法,沿着时间安排,它们都具有相同的结果表示方式:包含{value: count}的排序的dict

def f0(a):
    v, c = np.unique(a[a <= 16], return_counts=True)
    return dict(zip(v, c))

def f1(a):
    v, c = np.unique(a, return_counts=True)
    m = v <= 16
    return dict(zip(v[m], c[m]))

def f2(a):
    return dict(sorted(Counter(a[a <= 16]).items()))

def f3(a):
    return pd.value_counts(a[a <= 16]).sort_index().to_dict()

def f4(a):
    return pd.value_counts(a).sort_index().loc[1:16].to_dict()

试验:

np.random.seed(0)  # reproducibility
n = 1_000_000
a = np.random.randint(1, 22, n)

>>> f0(a)
{1: 47533,
 2: 47765,
 3: 47145,
 4: 47764,
 5: 47691,
 6: 47414,
 7: 47480,
 8: 47627,
 9: 48080,
 10: 47502,
 11: 47970,
 12: 48020,
 13: 47854,
 14: 47596,
 15: 47578,
 16: 47222}

以及:

%timeit f0(a)
# 29.1 ms ± 32.8 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit f1(a)
# 32.8 ms ± 36.4 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit f2(a)
# 93.8 ms ± 291 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit f3(a)
# 10 ms ± 29.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit f4(a)
# 5.82 ms ± 20.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

相关问题