2009-06-09 227 views
24

多維數組我創建Python中的多維數組是這樣的:迭代通過在Python

self.cells = np.empty((r,c),dtype=np.object) 

現在我想通過我的二維數組的所有元素進行迭代,我不關心順序。我如何實現這一目標?

回答

38

很明顯你正在使用numpy。隨着numpy的你可以做:

for cell in self.cells.flat: 
    do_somethin(cell) 
13

只是遍歷一個維度,然後是另一個維度。

for row in self.cells: 
    for cell in row: 
     do_something(cell) 

當然,只有兩個維度,可以壓縮下來到使用list comprehension或發電機表達一個循環,但是這不是很可擴展性和可讀性:

for cell in (cell for row in self.cells for cell in row): 
    do_something(cell) 

如果您需要將這個尺寸縮放到多個維度並且真的需要一個平面列表,您可以write a flatten function

+1

你說錯了。它應該是:對於單元格中的[行中的行在cell.cells中的行中]:do_something(cell) – xApple 2011-09-29 11:18:51

+0

哇,這個答案是古老的。你是對的;將修復。 – Eevee 2011-09-29 17:30:23

+0

他不是很好嗎?它只是一個生成器表達式,而不是列表理解......我錯過了什麼? O.o – 2011-10-02 11:20:15

4

如何:

import itertools 
for cell in itertools.chain(*self.cells): 
    cell.drawCell(surface, posx, posy) 
26

如果您需要更改個別單元格的值,然後ndenumerate(在numpy的)是你的朋友。即使你不這樣做,它可能仍然是!

for index,value in ndenumerate(self.cells): 
    do_something(value) 
    self.cells[index] = new_value 
6

你可以得到每個元素的索引以及使用枚舉命令元素本身:

for (i,row) in enumerate(cells): 
    for (j,value) in enumerate(row): 
    print i,j,value 

ij包含元素和value的行和列索引元素本身。

2

沒有人有答案,將工作形式任意許多方面沒有numpy的,所以我會放在這裏,我用

def iterThrough(lists): 
    if not hasattr(lists[0], '__iter__'): 
    for val in lists: 
     yield val 
    else: 
    for l in lists: 
     for val in iterThrough(l): 
     yield val 

for val in iterThrough(
    [[[111,112,113],[121,122,123],[131,132,133]], 
    [[211,212,213],[221,222,223],[231,232,233]], 
    [[311,312,313],[321,322,323],[331,332,333]]]): 
    print(val) 
    # 111 
    # 112 
    # 113 
    # 121 
    # .. 

這不會有很好的錯誤檢查遞歸解決方案,但它適用於我