Pythonic方案:numpy数组如何高效执行多可变切片操作 避免for循环
numpy多切片批量操作无循环实现方案
方案1:np.r_ 拼接索引
适合切片数量少、单切片长度大的场景,内存开销低:
import numpy as np a = np.array([0,1,2,3,4,5,6,7,8,9]) left = np.array([0,5]) right = np.array([2,8]) # 动态生成所有切片对象传给np.r_,自动展开为索引数组 slices = tuple(slice(l, r) for l, r in zip(left, right)) a[np.r_[slices]] = -1
执行后a的结果为 [-1 -1 2 3 4 -1 -1 -1 8 9],和循环实现结果完全一致。
方案2:广播生成掩码
完全向量化实现,无任何Python层循环,适合切片数量多、原数组总长度不大的场景:
import numpy as np a = np.array([0,1,2,3,4,5,6,7,8,9]) left = np.array([0,5]) right = np.array([2,8]) ar = np.arange(len(a)) # 广播比较生成所有切片的掩码,合并后赋值 mask = ((ar >= left[:, None]) & (ar < right[:, None])).any(axis=0) a[mask] = -1
选型参考
- 切片数量<100、单切片平均长度>10:优先选
np.r_方案 - 切片数量>100、原数组总长度<1e5:优先选广播掩码方案
内容的提问来源于stack exchange,提问作者A_d_r_i
相关产品推荐
相关产品推荐

