Numpy:如何在数组中滚动一“行”

7 投票
2 回答
3882 浏览
提问于 2025-04-18 13:38

我正在创建一个二维的numpy数组,简单来说就是像这样:

COL01 = np.array(["A", "D", "G"])
COL02 = np.array(["B", "E", "H"])
COL03 = np.array(["C", "F", "I"])

GRID = np.array([[COL01], [COL02], [COL03]])

我在代码中到处使用这个GRID。我想要修改GRID中的某一行,只滚动它的某个数组。例如,我想把GRID传递给一个函数,给它一个行号和要滚动的位数,然后返回结果。

我该怎么独立地滚动这一行呢?我试着参考了这里的答案: [独立滚动矩阵的行,但我没能弄明白怎么把那个答案应用到我的问题上。

2 个回答

0

这段代码可能能解决你的问题。

REV_GRID是GRID的一个变种,经过了一些处理。

COL01 = ["A", "D", "G"]
COL02 = ["B", "E", "H"]
COL03 = ["C", "F", "I"]

GRID = []
GRID.append(COL01)
GRID.append(COL02)
GRID.append(COL03)

REV_GRID = []

for col in GRID:
    REV_GRID.append(col[::-1])

print GRID
print REV_GRID

如果这段代码没有解决你的问题,请告诉我。我们会一起想办法解决。

10

你可以通过选择想要操作的行,然后使用 numpy.roll 来实现这个功能。

假设我们想把第一行向右移动一个位置:

import numpy as np

grid = np.array([['A', 'D', 'G'],
                 ['B', 'E', 'H'],
                 ['C', 'F', 'I']])

grid[0] = np.roll(grid[0], 1)
print grid

这样做的结果是:

[['G' 'A' 'D']
 ['B' 'E' 'H']
 ['C' 'F' 'I']]

注意,我们是在修改原来的数组。

你需要决定是想直接在原数组上操作(也就是修改原来的数据),还是每次都想先复制一份。重复调用的效果会根据你的选择而不同:

import numpy as np

def independent_roll_inplace(arr, ind, amount):
    arr[ind] = np.roll(arr[ind], amount)

def independent_roll_copy(arr, ind, amount):
    arr = arr.copy()
    arr[ind] = np.roll(arr[ind], amount)
    return arr

grid = np.array([['A', 'D', 'G'],
                 ['B', 'E', 'H'],
                 ['C', 'F', 'I']])

举个例子,如果我们每次都复制一份,那么我们就会从原始的网格“重新开始”。重复调用不会对原来的数据产生影响:

print 'Roll the second row one place'
print independent_roll_copy(grid, 1, 1)
print 'Roll the second row two places'
print independent_roll_copy(grid, 1, 2)
print 'Roll the second row three places'
print independent_roll_copy(grid, 1, 3)

这样做的结果是:

Roll the second row one place
[['A' 'D' 'G']
 ['H' 'B' 'E']
 ['C' 'F' 'I']]
Roll the second row two places
[['A' 'D' 'G']
 ['E' 'H' 'B']
 ['C' 'F' 'I']]
Roll the second row three places
[['A' 'D' 'G']
 ['B' 'E' 'H']
 ['C' 'F' 'I']]

但是,如果我们每次都在修改原来的数据,那么通过多次向右移动一个位置,我们会得到相同的结果:

for _ in range(3):
    print 'Roll the first row one place, modifying the original'
    independent_roll_inplace(grid, 0, 1)
    print grid

结果是:

Roll the second row one place, modifying the original
[['A' 'D' 'G']
 ['H' 'B' 'E']
 ['C' 'F' 'I']]
Roll the second row one place, modifying the original
[['A' 'D' 'G']
 ['E' 'H' 'B']
 ['C' 'F' 'I']]
Roll the second row one place, modifying the original
[['A' 'D' 'G']
 ['B' 'E' 'H']
 ['C' 'F' 'I']]

撰写回答