如何对独热编码矩阵行实现左右各1元素的平滑扩展?
实现独热编码的平滑扩展(左右各1位)
嘿,这个需求其实可以用Numpy的卷积或者滑动窗口来轻松实现,我给你两种靠谱的方案,都能完美得到你想要的目标矩阵:
方法一:一维卷积法(简洁高效)
这个方法利用Numpy的np.convolve函数,通过一个长度为3的卷积核,把独热位置及其左右相邻位都标记为1。mode='same'参数能保证输出和输入的维度完全一致,自动处理边界情况(比如首尾元素没有左/右邻居的场景)。
import numpy as np # 定义原始独热矩阵 X = np.array([[0., 0., 0., 1., 0.], [1., 0., 0., 0., 0.], [0., 0., 1., 0., 0.]]) # 定义卷积核:覆盖当前位置+左右各1位 kernel = np.array([1, 1, 1]) # 对每一行执行卷积,将结果转为0/1的浮点型矩阵 Y = np.array([np.convolve(row, kernel, mode='same') > 0 for row in X]).astype(float) # 输出结果 print(Y)
运行后输出正好是你要的目标矩阵:
[[0. 0. 1. 1. 1.] [1. 1. 0. 0. 0.] [0. 1. 1. 1. 0.]]
方法二:滑动窗口法(直观易懂)
如果你想更清晰地看到每一步的窗口覆盖逻辑,可以用滑动窗口视图实现。核心思路是先在每行首尾补0,然后滑动取3个元素的窗口,只要窗口内有1,就将对应位置设为1。
import numpy as np X = np.array([[0., 0., 0., 1., 0.], [1., 0., 0., 0., 0.], [0., 0., 1., 0., 0.]]) # 在每行的左右两侧各补一个0,处理边界 X_padded = np.pad(X, pad_width=((0,0),(1,1)), mode='constant') # 生成每行的滑动窗口(窗口大小3) windows = np.lib.stride_tricks.sliding_window_view(X_padded, window_shape=3, axis=1) # 对每个窗口求和,只要和>0就标记为1,转为浮点型 Y = (windows.sum(axis=2) > 0).astype(float) print(Y)
这个方法的输出和上面完全一致,适合需要理解窗口覆盖过程的场景。
关键说明
两种方法都能自动处理边界:
- 当独热位在第一列时,只会把当前位和右侧位设为1
- 当独热位在最后一列时,只会把当前位和左侧位设为1
- 中间位置则会覆盖左、中、右三个位置
内容的提问来源于stack exchange,提问作者gorjan
相关产品推荐
相关产品推荐

