首页 > 解决方案 > 使用 numpy.roll 独立滚动矩阵的行

问题描述

我想滚动一个 2D numpy 数组,每行滚动一个 1D 数组中定义的数量。例如,我有

A=np.array([[1,2,3],
            [4,5,6],
            [7,8,9]])

r=[1,2,2]

我希望执行以下任务:

C=np.copy(A)
for i in range(3):
    C[i]=np.roll(C[i],r[i])
print(C)

[[3 1 2]
 [5 6 4]
 [8 9 7]]

显然,numpy roll 函数支持数组作为输入。但它的工作方式令人费解,我没有得到我认为我应该得到的东西:

B=np.roll(A,r,1)
print(B)

[[2 3 1]
 [5 6 4]
 [8 9 7]]

在这里,所有行都移动了相同的量(从我的实验来看,这似乎是我的一维数组元素的总和)。我在这里做错了什么?numpy.roll 比 for 循环快得多,所以如果可能的话我想使用它,但我不能让它输出我想要的。

标签: pythonarraysnumpy

解决方案


numpy doc中,它解释了:

shiftint 或 ints 元组 元素移动的位置数。如果是元组,则轴必须是相同大小的元组,并且每个给定的轴都移动相应的数字。如果一个 int while 轴是一个整数元组,那么相同的值将用于所有给定的轴。

这解释了当您将 shift 作为元组提供时,您需要为轴提供相同大小的元组,并且每个维度都滚动一个常数,该常数是其在 shift 元组中的对应值。

例如,np.roll(A, (4,3), (1,2))移动axis=14 步和axis=23 步。

为了实现您的目标,请查看这篇文章以获取许多复杂的解决方案。


推荐阅读