2009-06-09 14 views
24

में एक बहुआयामी सरणी के माध्यम से मैं इस तरह अजगर में एक बहुआयामी सरणी बनाया है:पुनरावृत्ति अजगर

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

अब मैं अपने twodimensional सरणी के सभी तत्वों के माध्यम से पुनरावृति करना चाहते हैं, और मैं आदेश के बारे में परवाह नहीं है। मुझे यह कैसे हासिल होगा?

उत्तर

38

यह स्पष्ट है कि आप numpy का उपयोग कर रहे हैं। numpy के साथ आप बस कर सकते हैं:

for cell in self.cells.flat: 
    do_somethin(cell) 
+1

मुझे लगता है कि अब ['numpy.nditer()'] (https://docs.scipy.org/doc/numpy/reference/generated/numpy.nditer.html) के साथ ऐसा करने का एक और अधिक प्रभावी तरीका है – tuned

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

आपको यह गलत लगता है। यह होना चाहिए: सेल में [सेल में सेल के लिए self.cells में पंक्ति के लिए सेल]: do_something (सेल) – xApple

+0

वाह, यह उत्तर प्राचीन है। आप सही हे; ठीक कर देंगे। – Eevee

+0

क्या उसने ठीक नहीं किया है? यह सिर्फ एक सूची समझ के बजाय जनरेटर अभिव्यक्ति है ... क्या मुझे कुछ याद आ रही है? ओ.ओ –

4

कैसे इस बारे में:

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

' itertools.chain.from_iterable (self.cells) ' – jfs

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 

i, j तत्व और 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 
    # .. 

इस का उपयोग किया है बहुत अच्छा त्रुटि जाँच नहीं है डाल देता हूँ लेकिन यह मेरे लिए काम करता है

संबंधित मुद्दे