如何为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
相关产品推荐
相关产品推荐

