gpt4 book ai didi

python - 计算范围区间内数值数据的频率

转载 作者:太空宇宙 更新时间:2023-11-04 02:55:25 30 4
gpt4 key购买 nike

我正在尝试改进我的代码,该代码将随机生成的数字分类为范围间隔,以便分析随机数生成器的准确性。目前我的排序是由 20 个 elif 语句执行的(我对 python 只有入门知识),因此我的代码需要很长时间才能执行。如何更有效地将数字数据按区间排序,并只保存区间内出现频率的数字?

from datetime import datetime
startTime = datetime.now()
def test_rand(points):
import random
d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18,d19,d20 = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
# these variables will be used to count frequency of numbers into 20 intervals: (-10,-9], (-9,-8] ... etc
g1,g2,g3,g4,g5,g6,g7,g8,g9,g10,g11,g12,g13,g14,g15,g16,g17,g18,g19,g20 = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
# these variables will be used to count frequency of every 20 numbers into 20 intervals: (-200,-180], (-180,-160] ... etc
y = 0
n = 0
for i in range(points):
x = random.uniform(-10.0,10.0)
while n < 20:
y += x
n += 1
break
if n == 20:
if y < -180:
g1 += 1
elif y < -160 and y > -180:
g2 += 1
elif y < -140 and y > -160:
g3 += 1
elif y < -120 and y > -140:
g4 += 1
elif y < -100 and y > -120:
g5 += 1
elif y < -80 and y > -100:
g6 += 1
elif y < -60 and y > -80:
g7 += 1
elif y < -40 and y > -60:
g8 += 1
elif y < -20 and y > -40:
g9 += 1
elif y < 0 and y > -20:
g10 += 1
elif y < 20 and y > 0:
g11 += 1
elif y < 40 and y > 20:
g12 += 1
elif y < 60 and y > 40:
g13 += 1
elif y < 80 and y > 60:
g14 += 1
elif y < 100 and y > 80:
g15 += 1
elif y < 120 and y > 100:
g16 += 1
elif y < 140 and y > 120:
g17 += 1
elif y < 160 and y > 140:
g18 += 1
elif y < 180 and y > 160:
g19 += 1
elif y > 180:
g20 += 1
y *= 0
n *= 0

if x < -9:
d1 += 1
elif x < -8 and x > -9:
d2 += 1
elif x < -7 and x > -8:
d3 += 1
elif x < -6 and x > -7:
d4 += 1
elif x < -5 and x > -6:
d5 += 1
elif x < -4 and x > -5:
d6 += 1
elif x < -3 and x > -4:
d7 += 1
elif x < -2 and x > -3:
d8 += 1
elif x < -1 and x > -2:
d9 += 1
elif x < 0 and x > -1:
d10 += 1
elif x < 1 and x > 0:
d11 += 1
elif x < 2 and x > 1:
d12 += 1
elif x < 3 and x > 2:
d13 += 1
elif x < 4 and x > 3:
d14 += 1
elif x < 5 and x > 4:
d15 += 1
elif x < 6 and x > 5:
d16 += 1
elif x < 7 and x > 6:
d17 += 1
elif x < 8 and x > 7:
d18 += 1
elif x < 9 and x > 8:
d19 += 1
elif x > 9:
d20 += 1

return d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18,d19,d20,g1,g2,g3,g4,g5,g6,g7,g8,g9,g10,g11,g12,g13,g14,g15,g16,g17,g18,g19,g20

print(test_rand(100000000))

print (datetime.now() - startTime)

该代码旨在使用随机数执行 2 个函数。第一种是将数字分为 20 个区间(因此每个区间中应有 5% 的数字)。第二种是对每生成的20个数字进行求和,并将它们放入20个新的区间(应该观察到一条正态曲线)

@tristan 我已经修改了您执行上述操作的代码:

for idx in range(points):
val_1 = uniform(-10, 10)
val_20 += val_1
if (idx + 1) % 20 == 0:
counter2[bisect(occ2, val_20)] += 1
counter1[bisect(occ1, val_1)] += 1
val_20 = 0
val_1 = 0
else:
counter1[bisect(occ1, val_1)] += 1
val_1 = 0

虽然此方法仅节省 6 秒(1:54 --> 1:48),但它更有条理且更易于查看。感谢您的帮助!

最佳答案

假设数据总是可以分配给您的一个间隔(您可以预先检查),使用 bisect.bisect() 将是一种高效且紧凑的方式:

from bisect import bisect
from random import randint

occ1 = [-9 + 1 * i for i in range(19)]
occ2 = [-180 + 20 * i for i in range(19)]
data = [randint(-10, 10) for _ in range(100)]
counter1, counter2 = {i: 0 for i in range(20)}, {i: 0 for i in range(20)}

for idx, element in enumerate(data):
if (idx + 1) % 20 == 0:
counter2[bisect(occ2, element)] += 1
else:
counter1[bisect(occ1, element)] += 1

bisect() 函数返回位置元素 应该被插入到像occ 维持秩序。 occ 中有 19 个值,有 20 个不同的位置可以插入一个值。也就是说,在第一个元素之前、任何元素之间或最后一个元素之后。这对应于您的 20 个间隔。唯一要注意的是,e。 G。一个元素小于或大于间隔的上限或下限,它仍将分配给最低或最高间隔。不过,生成遵守区间界限的随机数可以防止这种情况发生。

根据你的问题,我不确定你是想累积一些随机数还是只检查点列表,其中每 20 个值执行一次不同的检查。该解决方案可以很容易地适应累积随机数,直到达到 20 次迭代:

from bisect import bisect
from random import uniform

points, value = 100000000, 0
occ1 = [-9 + 1 * i for i in range(19)]
occ2 = [-180 + 20 * i for i in range(19)]
counter1, counter2 = {i: 0 for i in range(20)}, {i: 0 for i in range(20)}

for idx in range(points):
value += uniform(-10, 10)
if (idx + 1) % 20 == 0:
counter2[bisect(occ2, value)] += 1
value = 0
else:
counter1[bisect(occ1, value)] += 1

在我的机器上运行 100M 点需要 100 秒。

关于python - 计算范围区间内数值数据的频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42543318/

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