Numpy:如何在数组中滚动一“行”
我正在创建一个二维的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']]