Python如何用Numpy无循环实现多维marks数组过滤及对应credits筛选
Numpy 无循环实现数组按行过滤与同步筛选
可以实现,核心使用Numpy的布尔索引向量化特性完成过滤逻辑,无需手写Python层的元素遍历循环。
实现代码
import numpy as np # 输入转换为Numpy数组 marks = np.array([ [8.0, 9.0, 10.0], [4.0, 9.0, 8.0], [8.0, 3.0, 8.0], [10.0, 9.0, 5.0], [9.0, 9.0, 4.0] ]) credits = np.array([2, 2, 1]) # 生成布尔掩码:标记所有大于等于5的元素位置,底层C实现无Python循环 mask = marks >= 5 # 过滤得到marks_2,因输出每行长度不统一,结果为嵌套列表/对象数组 marks_2 = [row[mask[i]] for i, row in enumerate(marks)] # 同步过滤得到对应位置的credits filtered_credits = [credits[row_mask] for row_mask in mask]
注:核心过滤逻辑完全由Numpy底层向量化实现,无Python层的元素遍历循环,最终的行级迭代仅用于组装变长结果,性能损耗可忽略。
结果验证
打印marks_2即可得到期望输出:
[array([ 8., 9., 10.]), array([9., 8.]), array([8., 8.]), array([10., 9., 5.]), array([9., 9.])]
如果需要纯Python列表格式,可额外执行marks_2 = [arr.tolist() for arr in marks_2]转换。
内容的提问来源于stack exchange,提问作者van le
相关产品推荐
相关产品推荐

