如何基于outlier数组筛选多维列表epoch的指定列生成新列表E
问题:根据outlier数组筛选epoch中的列并生成新列表E
数据定义
import numpy as np epoch = [(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), np.array([100, 101, 102])), (np.array([[10, 11, 12], [13, 14, 15], [16, 17, 18]]), np.array([103, 104, 105]))] outlier = np.array([10,32,56])
需求说明
仅当outlier对应索引的值≤40时,保留epoch中对应索引的列。例如outlier[2]=56>40,因此剔除所有元素的第三列,最终期望得到:
E = [(np.array([[1, 2], [4, 5], [7, 8]]), np.array([100, 101])), (np.array([[10, 11], [13, 14], [16, 17]]), np.array([103, 104]))]
尝试的错误代码
E = list() j = 0 for idx, l in enumerate(epoch): epo = np.transpose(epoch[idx][0]) for i in range(len(epo)): while j < 3: if outlier[j]<= 40: E.append(epoch[idx][:][i]) j+=1 else: j+=1
错误结果
[array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])]
正确实现方法
针对大规模数据,推荐用numpy的布尔索引实现向量化筛选,避免低效嵌套循环:
- 生成筛选掩码:标记
outlier中值≤40的位置 - 遍历
epoch的每个元组,对元组内的二维数组和一维数组分别用掩码筛选列 - 将筛选后的元组存入新列表
E
代码实现:
import numpy as np # 生成布尔掩码:True表示保留对应列 mask = outlier <= 40 E = [] for arr1, arr2 in epoch: # 二维数组按列筛选,一维数组直接按掩码筛选 filtered_arr1 = arr1[:, mask] filtered_arr2 = arr2[mask] E.append( (filtered_arr1, filtered_arr2) ) # 验证结果 print(E)
输出结果
[(array([[1, 2], [4, 5], [7, 8]]), array([100, 101])), (array([[10, 11], [13, 14], [16, 17]]), array([103, 104]))]
这种方法利用numpy的向量化操作,执行效率远高于嵌套循环,适合处理大规模数据集。
内容的提问来源于stack exchange,提问作者Amelia
相关产品推荐
相关产品推荐

