如何对二维NumPy数组提取不等长列子集并用NaN填充?
解决方法
你的问题核心是要对二维数组的每列单独提取不同起始位置的子集,并将前面的位置用NaN填充。你之前的索引方式错误地选取了行切片的组合,而非针对列进行单独处理。下面提供两种可行方案:
方法一:循环逐列处理(直观易懂)
先创建一个和原数组形状完全一致的全NaN数组,再逐列将原数组对应起始位置到末尾的内容赋值进去:
import numpy as np # 生成示例数据 data = np.random.normal(size=(100,4)) # 各列的起始索引 start_indices = [75, 33, 42, 54] # 创建全NaN的结果数组 result = np.full_like(data, np.nan) # 逐列赋值 for col_idx, start in enumerate(start_indices): result[start:, col_idx] = data[start:, col_idx]
方法二:广播掩码法(无循环,更高效)
利用NumPy的广播机制生成掩码矩阵,通过np.where一次性完成赋值,适合列数较多的场景:
import numpy as np data = np.random.normal(size=(100,4)) start_indices = [75, 33, 42, 54] # 生成行索引矩阵,与起始索引广播比较 row_indices = np.arange(data.shape[0])[:, np.newaxis] # 生成掩码:行索引 >= 对应列的起始索引 mask = row_indices >= start_indices # 根据掩码赋值,满足条件的位置用原数据,否则用NaN result = np.where(mask, data, np.nan)
为什么你的原代码无效?
data[[slice(75,100),slice(33,100)],:]这种写法是选取行的组合:它会把行索引75-99的所有行,和行索引33-99的所有行合并,最终得到一个行数为(100-75)+(100-33)=132的数组,完全不符合你“每列单独处理”的需求。
内容的提问来源于stack exchange,提问作者R Walser
相关产品推荐
相关产品推荐

