基于滑动窗口提取整数列表独热编码及DataFrame数值转二进制序列
我来帮你一步步搞定这个需求——把从Bed文件计算出的中心整数序列转换成二进制序列,再实现滑动窗口的独热编码。咱们从你现有的代码出发,逐步拓展:
第一步:将整数列表转换为二进制序列
你的centers是一个整数类型的Pandas Series,首先要把每个整数转成二进制位序列。这里建议统一所有二进制的长度(比如根据序列中最大数的二进制位数补前导0),避免后续滑动窗口处理时出现长度不一致的问题。
import pandas as pd import numpy as np # 你的原有代码 file = pd.read_csv('chr1.bed', sep='\t', header=None) centers = (file[2] - file[1])/2 + file[1] centers = centers.apply(lambda x: round(x)) # 新增:转换为固定长度的二进制序列 # 获取序列中最大整数的二进制位数,确保所有二进制字符串长度一致 max_bit_length = centers.max().bit_length() # 将每个整数转成固定长度的二进制字符串,拆分为单个bit的整数数组,再展开为一维序列 binary_sequence = centers.apply( lambda x: [int(bit) for bit in format(x, f'0{max_bit_length}b')] ).explode().reset_index(drop=True)
解释:
format(x, f'0{max_bit_length}b')会把整数x转换成长度为max_bit_length的二进制字符串,不足的位用前导0填充explode()把每个整数对应的二进制列表展开成单独的行,最终得到一维的二进制位序列(每个元素是0或1)
第二步:滑动窗口提取独热编码序列
接下来我们要实现每x个元素的滑动窗口,并对窗口内的每个二进制位做独热编码(0→[1,0],1→[0,1])。这里提供两种实现方式:
方式1:手动实现(无额外依赖)
如果不想引入第三方库,手动处理独热编码和滑动窗口:
# 定义滑动窗口大小,替换成你需要的x值 window_size = 5 # 把二进制序列转成numpy数组方便处理 binary_np = binary_sequence.to_numpy() # 生成滑动窗口:每个窗口包含window_size个连续的二进制位 windows = np.lib.stride_tricks.sliding_window_view(binary_np, window_shape=window_size) # 对每个窗口的每个bit做独热编码,再拼接成窗口的独热向量 def one_hot_encode(bit): return [1, 0] if bit == 0 else [0, 1] one_hot_windows = np.array([ np.concatenate([one_hot_encode(bit) for bit in window]) for window in windows ])
方式2:用Scikit-learn简化编码(适合大规模数据)
如果你的数据量较大,用sklearn的OneHotEncoder会更高效:
from sklearn.preprocessing import OneHotEncoder # 定义滑动窗口大小 window_size = 5 binary_np = binary_sequence.to_numpy().reshape(-1, 1) # 初始化独热编码器,适配0和1两类值 encoder = OneHotEncoder(sparse_output=False, categories='auto') encoder.fit(binary_np) # 生成滑动窗口 windows = np.lib.stride_tricks.sliding_window_view(binary_np, window_shape=(window_size,)) windows = windows.squeeze(axis=1) # 调整窗口形状为(n_windows, window_size) # 对每个窗口的所有元素做独热编码,再拼接成最终的窗口向量 one_hot_windows = encoder.transform(windows.reshape(-1, 1)).reshape(windows.shape[0], window_size * 2)
最终one_hot_windows就是你需要的结果:每一行对应一个滑动窗口的独热编码序列,长度为window_size * 2(每个bit对应2维独热向量)。
内容的提问来源于stack exchange,提问作者xenopus
相关产品推荐
相关产品推荐

