在python数组中移动行和列
我正在构建一个基本的映射机器人,所有数据都存储在一个2D python数组中。但是,我无法找到任何方法来移动整行或整列,然后在其中插入空白行/列。例如:在python数组中移动行和列,python,arrays,Python,Arrays,我正在构建一个基本的映射机器人,所有数据都存储在一个2D python数组中。但是,我无法找到任何方法来移动整行或整列,然后在其中插入空白行/列。例如: ['#','0','0'] ['0','1','0'] ['#','0','0'] 如果移动到右侧,看起来像: ['0','#','0'] ['0','0','1']
['#','0','0']
['0','1','0']
['#','0','0']
如果移动到右侧,看起来像:
['0','#','0']
['0','0','1']
['0','#','0']
['0','0','0']
['#','0','#']
['0','1','0']
或
如果向下移动,看起来像:
['0','#','0']
['0','0','1']
['0','#','0']
['0','0','0']
['#','0','#']
['0','1','0']
我已经知道了当在预定义数组之外检测到某些东西时如何扩展数组,但是我无法像上面演示的那样移动行和列
任何帮助都将不胜感激。谢谢:)你看过numpy和numpy.roll了吗
import numpy as np
a = np.array([['#','0','0'],
['0','1','0'],
['#','0','0']])
然后你可以右转:
a = np.roll(a,1)
a[:,0] = 0
左移:
a = np.roll(a,-1)
a[:,-1] = 0
上移:
a = np.roll(a,-1,axis = 0)
a[-1,:] = 0
下移:
a = np.roll(a,1,axis = 0)
a[0,:] = 0
您可以创建一个类来处理这种移动,如下所示:
class Board(object):
def __init__(self, rows):
self.rows = rows
self.print_status()
def print_status(self):
for row in self.rows:
print(row)
def right(self):
new_rows = []
for row in self.rows:
row = row[-1:] + row[:len(row)-1]
new_rows.append(row)
self.rows = new_rows
self.print_status()
def left(self):
new_rows = []
for row in self.rows:
row = row[1:] + row[:1]
new_rows.append(row)
self.rows = new_rows
self.print_status()
def up(self):
new_rows = []
for row in self.rows[1:]:
new_rows.append(row)
new_rows.append(self.rows[0])
self.rows = new_rows
self.print_status()
def down(self):
new_rows = []
new_rows.append(self.rows[-1])
for row in self.rows[:-1]:
new_rows.append(row)
self.rows = new_rows
self.print_status()
例如:
>>> a = Board([[1,2,3],[4,5,6],[7,8,9]])
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
>>> a.down()
[7, 8, 9]
[1, 2, 3]
[4, 5, 6]
>>> a.up()
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
>>> a.right()
[3, 1, 2]
[6, 4, 5]
[9, 7, 8]
这可以通过numpy的“滚动”功能轻松完成
您的例子:
import numpy as np
a = np.array([['#','0','0'], ['0','1','0'], ['#','0','0']])
输出将是:
array([['#', '0', '0'],
['0', '1', '0'],
['#', '0', '0']], dtype='<U1')
输出将是
array([['0', '#', '0'],
['0', '0', '1'],
['0', '#', '0']], dtype='<U1')
产量将是
array([['#', '0', '#'],
['0', '1', '0'],
['0', '0', '0']], dtype='<U1')
输出
array([['0', '0', '0'],
['#', '0', '#'],
['0', '1', '0']], dtype='<U1')
数组([['0',0',0'],
['#', '0', '#'],
['0','1','0']],dtype='numpy解决方案工作得很好,但是这里有一个纯Python的解决方案,没有导入。请注意,大多数代码只打印结果——每卷只使用一行代码。我还添加了shiftedup
,其中矩阵向上旋转,最后一行替换为全零(尽管这样做效率更高)
该文件的打印输出为:
Original:
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
Rolled up:
[4, 5, 6]
[7, 8, 9]
[1, 2, 3]
Rolled down:
[7, 8, 9]
[1, 2, 3]
[4, 5, 6]
Rolled left:
[2, 3, 1]
[5, 6, 4]
[8, 9, 7]
Rolled right:
[3, 1, 2]
[6, 4, 5]
[9, 7, 8]
Shifted up:
[4, 5, 6]
[7, 8, 9]
[0, 0, 0]
roll本身并不会插入空行,它只是从数组的另一侧获取。您知道有没有这样一种方法:将顶部的数字替换为底部的数字,然后替换为一行零。例如:[1,2,3][4,5,6][7,8,9]变为[4,5,6][7,8,9][0,0,0]@user9015687:查看我的代码和打印输出中的添加内容。谢谢,这非常有效。我对使用冒号操纵数组有点困惑,我到处都看到过冒号,但我不太理解它们。你不能告诉我它们是什么意思,可以吗。Thanks@user9015687:这是Python的切片表示法如果您仍然不理解切片,请在“python切片”上进行web搜索。这些解释比我更好。
array([['0', '0', '0'],
['#', '0', '#'],
['0', '1', '0']], dtype='<U1')
myarray = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
]
print('\nOriginal:')
for row in myarray:
print(row)
rolledup = myarray[1:] + myarray[:1]
print('\nRolled up:')
for row in rolledup:
print(row)
rolleddown = myarray[-1:] + myarray[:-1]
print('\nRolled down:')
for row in rolleddown:
print(row)
rolledleft = [row[1:] + row[:1] for row in myarray]
print('\nRolled left:')
for row in rolledleft:
print(row)
rolledright = [row[-1:] + row[:-1] for row in myarray]
print('\nRolled right:')
for row in rolledright:
print(row)
shiftedup= myarray[1:] + [[0] * len(myarray[0])]
print('\nShifted up:')
for row in shiftedup:
print(row)
Original:
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
Rolled up:
[4, 5, 6]
[7, 8, 9]
[1, 2, 3]
Rolled down:
[7, 8, 9]
[1, 2, 3]
[4, 5, 6]
Rolled left:
[2, 3, 1]
[5, 6, 4]
[8, 9, 7]
Rolled right:
[3, 1, 2]
[6, 4, 5]
[9, 7, 8]
Shifted up:
[4, 5, 6]
[7, 8, 9]
[0, 0, 0]