簡體   English   中英

在python數組中移動行和列

[英]Shifting rows and columns in a python array

我正在構建一個基本的映射機器人,其中所有數據都存儲在2D python數組中。 但是,我找不到任何方法可以移動整個行或列,然后在其中插入空白行/列。例如:

['#','0','0']        
['0','1','0']                                            
['#','0','0']

如果移到右邊,看起來像:

['0','#','0']        
['0','0','1']                                            
['0','#','0']

要么

['#','0','#']         
['0','1','0']                                     
['0','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的“ roll”功能輕松完成
您的示例:

import numpy as np
a = np.array([['#','0','0'], ['0','1','0'], ['#','0','0']])

輸出將是:

array([['#', '0', '0'],
   ['0', '1', '0'],
   ['#', '0', '0']], dtype='<U1')

對於第一個用例:

np.roll(a, 1, 1)

輸出將是

array([['0', '#', '0'],
   ['0', '0', '1'],
   ['0', '#', '0']], dtype='<U1')

對於第二種情況,您可以簡單地轉置:

a.T

和輸出將是

array([['#', '0', '#'],
   ['0', '1', '0'],
   ['0', '0', '0']], dtype='<U1')

第三種情況是對轉置矩陣應用numpy roll操作

np.roll(a.T, 1, 0)

產量

array([['0', '0', '0'],
   ['#', '0', '#'],
   ['0', '1', '0']], dtype='<U1')

numpy解決方案效果很好,但是這里是純Python解決方案,沒有導入。 請注意,大多數代碼僅打印結果-每卷僅使用一行代碼。 我還添加了shiftedup ,將矩陣向上旋轉,然后將最后一行替換為全零(盡管比這更有效)。

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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM