- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试改进我的代码,该代码将随机生成的数字分类为范围间隔,以便分析随机数生成器的准确性。目前我的排序是由 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/
我在 Python 中使用 matplotlib,并制作了一个带条形的直方图。现在,当直方图出现时,仅 5 的倍数出现在 x 轴上,1000 的倍数出现在 y 轴上。对于 y 轴,这完全没有问题,但对
我正在使用 JavaScript 和 jQuery。我有以下脚本每 30 秒提醒一次 hi。 $(document).ready( function() { alert("hi"); setI
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
在 Numpy(python 包)中,可以使用语法 numpy.linspace(minValue, MaxValue, numberOfSamples) 构造 float 的离散区间。 . 我看到
所以我想在 -3 到 3 的区间内制作一些数字,以便在下面绘制这些函数,所以我想要尽可能多的数字。 我这样做: double k[601]; double y[601]; for (int i = 0
我有一个 Postgresql 表,用于存储有关计划进程的信息,包括上次执行进程的时间。不同的进程对其运行频率有不同的要求。 我列出了需要重新运行的进程列表: SELECT * FROM proces
如何正确使用此类带日期间隔的查询 @SqlUpdate("delete fromlogin where created < now() - ':days days' :: interval") v
我正在尝试计算图中的间隔,我在维基百科上找到了算法的数学描述: http://en.wikipedia.org/wiki/Interval_(graph_theory) H = { n0 }
我有一个基于 Informix-SQL 的 Pawnshop 应用程序,该应用程序根据黄金的重量和纯度计算应向客户贷出多少钱。当铺的最低贷款额为 5.00 美元。当铺员工通常会借出以 5 或 0 结尾
我将 NHibernate 与代码映射一起使用,并且我有一个由此公式创建的属性。 Property(x => x.IsInOverdue, mapper => mapper .Fo
我正在尝试从头开始为 Beta 分布编写卡方拟合优度检验,而不使用任何外部函数。下面的代码报告“1”适合,即使来自 scipy.stats 的 kstest 返回零。数据是正常分布的,所以我的函数也应
如何在 C# 中将任何值四舍五入到 10 区间?例如,如果我有 11,我希望它返回 10,如果我有 136,那么我希望它返回 140。 我可以很容易地用手做 return ((int)(number
如何在 Go 中表示 PostgreSQL 区间? 我的结构看起来像这样: type Product struct { Id int Name
我想编写一个函数,将数值限制在封闭的 0,1 区间内: func clamp01(_ value:T) -> T { return value 1 ? 1 : value } 在 Swift 3
我有一个简单的表格,用于存储来自在线仪表的降水读数。这是表定义: CREATE TABLE public.precip ( gauge_id smallint,
a = y def __gt__(self, y): return not self.x > y def __eq__(self, y): return
我正在处理 pandas 数据框 D=pd.DataFrame(data=[1.0,2.0,2.0,2.0,5.0,3.0,2.0,2.0,5.0,5.0,8.0,1.0]) 我识别低于特定阈值的值
我编写了一些C++代码来解决此问题: #include #include using namespace std; unsigned int countSetBits(unsigned int n
好的,我知道之前有人用一个有限的缩放示例问过这个问题 [-1, 1]间隔 [a, b] Different intervals for Gauss-Legendre quadrature in num
我是一名优秀的程序员,十分优秀!