You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 08:20:08