如何基于正弦函数规则排序数值,生成模拟心率波动的mock数据?
实现方案
方案1:基于自定义排序key实现(符合你原本的思路)
你的需求对应[0, π]区间内的正弦函数走势:值从0升到1再回落至0,正好匹配从谷值60升到峰值100再回落至60的规律,实现逻辑如下:
- 先把你生成的所有随机数做升序排序
- 给结果数组的每个位置计算对应的正弦权重,按照权重从小到大的顺序分配排序后的随机数,最终得到的数组就会自然呈现正弦走势
import numpy as np # 你原来的生成随机数逻辑 A = [] for _ in range(10000): value = np.random.randint(60,100) A.append(value) # 正弦形态排序实现 n = len(A) sorted_A = sorted(A) # 计算每个位置的正弦权重 weight = np.sin(np.pi * np.arange(n) / (n-1)) # 按权重从小到大排序得到位置索引 sorted_pos = np.argsort(weight) # 构建结果数组:把升序的数值按权重位置分配 res = np.zeros_like(A) res[sorted_pos] = sorted_A # 输出结果就是你要的正弦形态数组 print(res)
如果需要多峰波动效果(多个心率周期),把权重计算里的np.pi改成2 * np.pi * 周期数即可。
方案2:直接生成带随机波动的正弦模拟心率(更适合mock场景)
如果不需要固定使用你提前生成的那批随机数,直接生成的方案更简单,还可以加入自然的小波动,更接近真实心率:
import numpy as np n = 10000 # 基础正弦曲线:60是谷值,40是峰谷差 base = 60 + 40 * np.sin(np.pi * np.arange(n) / (n-1)) # 加入±2的随机波动,模拟真实心率的小起伏 mock_heart_rate = np.clip(base + np.random.randint(-2, 3, size=n), 60, 100).astype(int)
方案3:Faker实现思路
Faker的providers.health模块内置了heart_rate()方法,可以直接生成符合正常人心率范围的数值,你可以结合上面的正弦权重,给不同位置的数值设定生成范围,就能得到正弦形态的心率数据。但这个方案需要额外引入Faker依赖,灵活度也不如自己生成,除非你已经在项目里用了Faker,否则更推荐前两个方案。
内容的提问来源于stack exchange,提问作者Serena
相关产品推荐
相关产品推荐

