如何从scikit-fda的FDataGrid实例中删除特定函数?
问题原因分析
第一个错误的根源
np.delete(X_prim, [0,1,2])会把FDataGrid实例当成普通numpy数组处理,直接返回一个numpy.ndarray——这是因为numpy的函数默认会尝试将输入对象转换为数组。所以你后续调用X.tolist()看着像对,但X已经不是FDataGrid实例了,自然没有data_matrix这类专属属性,导致MissingValuesInterpolation报错。
第二个错误的根源
FDataGrid的data_matrix形状通常是(n_samples, n_dimensions, n_grid_points),其中第一维是样本(也就是你说的“函数”)的数量。你直接调用np.delete(matrix, [2,13,103,111])时,numpy默认会按最后一维(网格点维度)删除元素,而不是你想要的第一维(样本维度)。这就导致修改后的data_matrix形状完全不对,重新创建FDataGrid时,系统会错误地把修改后的维度当成样本数,自然识别成只有一个函数,同时grid_points因为和新的data_matrix维度不匹配而被破坏。
正确解决方案
FDataGrid本身支持numpy风格的索引操作,直接通过索引筛选保留的样本即可,无需手动处理data_matrix:
方法1:用整数索引保留需要的样本
import numpy as np # 定义要保留的样本索引(排除要删除的[0,1,2]) keep_idx = np.setdiff1d(np.arange(X_prim.n_samples), [0,1,2]) # 直接索引得到新的FDataGrid实例 X_filtered = X_prim[keep_idx]
方法2:用布尔掩码筛选
import numpy as np # 创建掩码,标记要保留的样本(True=保留,False=删除) mask = np.ones(X_prim.n_samples, dtype=bool) mask[[0,1,2]] = False # 把要删除的索引设为False X_filtered = X_prim[mask]
这样得到的X_filtered仍是完整的FDataGrid实例,保留了原有的grid_points、data_matrix等所有属性,后续可以正常使用MissingValuesInterpolation处理。
内容的提问来源于stack exchange,提问作者confusedTurtle
相关产品推荐
相关产品推荐

