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

如何为NumPy二维数组各行设置不同步长实现滚动移位?

为NumPy数组每行设置不同步长的滚动移位

你可以通过构造索引数组结合NumPy的高级索引功能来实现这个需求,下面是具体的实现方法:

方法实现

假设你的数组和目标步长如下:

import numpy as np
a = np.array([[0,1,2,3],[4,5,6,7]])
shifts = np.array([1, 2])  # 第一行步长1,第二行步长2

步骤1:生成基础列索引

先获取数组的列数,生成原始的列索引数组:

cols = np.arange(a.shape[1])  # 输出:array([0, 1, 2, 3])

步骤2:计算每行的移位后索引

利用广播机制,为每行生成对应的移位后列索引(取模运算保证索引在合法范围内,这里的步长对应你需求中的向左滚动步数):

new_indices = (cols + shifts[:, None]) % a.shape[1]
# 输出new_indices:
# array([[1, 2, 3, 0],
#        [2, 3, 0, 1]])

步骤3:提取移位后的数组

通过高级索引从原数组中提取对应元素:

result = a[np.arange(a.shape[0])[:, None], new_indices]
# 输出result:
# array([[1, 2, 3, 0],
#        [6, 7, 4, 5]])

你也可以用np.take函数简化这一步,效果完全相同:

result = np.take(a, new_indices, axis=1)

为什么np.roll无法直接实现?

np.roll的shift参数在指定axis后,只能接受一个标量值(即所有行/列使用相同的移位步长),不支持为每行单独设置不同步长,因此无法直接满足你的需求。

内容的提问来源于stack exchange,提问作者Domenico

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 14:14:37