如何使用Python为200万行GWAS数据的每个SNP生成随机浮点数
GWAS SNP_ID匹配随机浮点数实现方案
原代码存在的问题
np.random.random仅支持传入单个整数参数指定生成数组的长度,传入(0, len(SNP.csv))会直接触发参数报错;且SNP.csv是文件名字符串,len(SNP.csv)拿到的是文件名的字符长度,不是文件实际的数据行数。- 循环逐行读取时没有跳过第一行的
SNP_Id表头,也没有将读取到的SNP值与生成的随机数做绑定输出,循环内反复生成全量长度的随机数组会产生大量冗余计算,200万行规模下运行效率极低。 - 没有配置结果写入逻辑,即使随机数生成正常也无法得到目标格式的输出文件。
可直接运行的实现方案
200万行数据规模下优先选择批量生成的方案,全程运行时间不超过5秒,内存占用稳定。
方案1:仅依赖csv+numpy(无额外pandas依赖)
import csv import numpy as np # 按需修改文件路径和随机数范围 input_file = "SNP.csv" output_file = "SNP_result.csv" val_min = 0 val_max = 1000 # 和示例输出的数值范围匹配 # 读取所有SNP_ID,跳过表头 with open(input_file, "r", newline="", encoding="utf-8") as f: reader = csv.reader(f) next(reader) snp_list = [row[0] for row in reader if row] # 一次性批量生成对应数量的随机浮点数,保留1位小数 rand_vals = np.round(np.random.uniform(val_min, val_max, size=len(snp_list)), 1) # 按要求格式写入结果 with open(output_file, "w", newline="", encoding="utf-8") as f: writer = csv.writer(f) for snp_id, val in zip(snp_list, rand_vals): writer.writerow([snp_id, val])
方案2:pandas简洁实现(适合已安装pandas的分析环境)
import pandas as pd import numpy as np # 读取数据 df = pd.read_csv("SNP.csv") # 生成指定范围的1位小数随机数 df["rand_val"] = np.round(np.random.uniform(0, 1000, len(df)), 1) # 输出无表头、逗号分隔的目标格式文件 df.to_csv("SNP_result.csv", index=False, header=False)
注意:如果需要固定随机结果保证实验可复现,在生成随机数的代码前加一行
np.random.seed(任意整数)即可,后续每次运行都会生成完全一致的随机数序列。
内容的提问来源于stack exchange,提问作者paul raj
相关产品推荐
相关产品推荐

