如何用Numpy高效反转子列表内的元素顺序?
Numpy高效实现分块数组内元素反转
方案一:分块索引拼接(简洁高效)
通过计算每个分块的起止位置,生成各分块的逆序索引并拼接,最终一次性索引原数组得到结果:
import numpy as np Values = np.array([5, 6, 7, 8, 1, 2, 3, 14, 15, 16]) Lengths = np.array([4, 3, 3]) # 计算每个分块的起始和结束索引 starts = np.r_[0, Lengths.cumsum()[:-1]] ends = Lengths.cumsum() # 生成各分块的逆序索引并拼接成全局索引数组 indices = np.concatenate([np.arange(start, end)[::-1] for start, end in zip(starts, ends)]) # 直接索引得到反转后的结果 result = Values[indices] print(result) # 输出:[ 8 7 6 5 3 2 1 16 15 14]
方案二:完全向量化实现(无Python循环)
针对超大规模数据,可通过构造块编号、块内位置等数组,完全用Numpy向量化操作生成逆序索引:
import numpy as np Values = np.array([5, 6, 7, 8, 1, 2, 3, 14, 15, 16]) Lengths = np.array([4, 3, 3]) # 计算分块起始索引 starts = np.r_[0, Lengths.cumsum()[:-1]] # 生成每个元素所属的块编号 block_ids = np.repeat(np.arange(len(Lengths)), Lengths) # 生成每个元素在对应块内的原始位置 block_pos = np.concatenate([np.arange(l) for l in Lengths]) # 计算块内逆序后的位置 reverse_block_pos = (Lengths[block_ids] - 1) - block_pos # 转换为全局索引 indices = starts[block_ids] + reverse_block_pos # 获取最终结果 result = Values[indices] print(result) # 输出:[ 8 7 6 5 3 2 1 16 15 14]
两种方案都比显式逐元素处理的for循环高效得多,方案一兼顾简洁性和性能,方案二则完全依赖Numpy底层优化,适合处理海量数据。
内容的提问来源于stack exchange,提问作者ElaineT
相关产品推荐
相关产品推荐

