2017-08-17 10 views
6

मेरे पास dataset है जिसमें 4 आयाम हैं (अभी के लिए ...) और मुझे इसे फिर से चालू करने की आवश्यकता है।इस एन-आयामी डेटासेट पर फिर से कैसे चलें?

dataset में एक मूल्य तक पहुंचने के लिए मैं यह कर,:,

value = dataset[i,j,k,l] 

अब मैं dataset के लिए shape प्राप्त कर सकते हैं:

shape = [4,5,2,6] 

shape में मानों की लंबाई का प्रतिनिधित्व आयाम।

आयामों की संख्या को देखते हुए, क्या मैं अपने डेटासेट में सभी तत्वों को पुन: सक्रिय कर सकता हूं?

for i in range(shape[0]): 
    for j in range(shape[1]): 
     for k in range(shape[2]): 
      for l in range(shape[3]): 
       print('BOOM') 
       value = dataset[i,j,k,l] 

भविष्य में, shape बदल सकती है: यहाँ एक उदाहरण है। तो उदाहरण के लिए, shape में वर्तमान 4 के बजाय 10 तत्व हो सकते हैं।

क्या Python 3 के साथ ऐसा करने का एक अच्छा और साफ तरीका है?

+0

मुझे लगता है कि एक [पुनरावर्ती] (http : //www.python-course.eu/recursive_functions.php) समाधान आपके लिए सबसे अच्छा समाधान होगा। – Yonlif

+0

संभावित डुप्लिकेट [पायथन में एक बहुआयामी सरणी के माध्यम से Iterating] (https://stackoverflow.com/questions/971678/iterating-through-a-multidimensional-array-in-python) –

उत्तर

6

आप itertools.product का उपयोग cartesian product1 कुछ मूल्यों के से अधिक पुनरावृति करने के लिए (इस मामले में सूचकांक) कर सकते हैं:

import itertools 
shape = [4,5,2,6] 
for idx in itertools.product(*[range(s) for s in shape]): 
    value = dataset[idx] 
    print(idx, value) 
    # i would be "idx[0]", j "idx[1]" and so on... 

हालांकि अगर यह एक numpy सरणी तुम पर पुनरावृति करना चाहते है, यह np.ndenumerate उपयोग करने के लिए आसान हो सकता है:

import numpy as np 

arr = np.random.random([4,5,2,6]) 
for idx, value in np.ndenumerate(arr): 
    print(idx, value) 
    # i would be "idx[0]", j "idx[1]" and so on... 

आपने स्पष्टीकरण के लिए पूछा कि itertools.product(*[range(s) for s in shape]) वास्तव में क्या करता है। तो मैं इसे अधिक जानकारी में समझाऊंगा।

for i, j in itertools.product(range(10), range(8)): 
#          ^^^^^^^^---- the inner for loop 
#        ^^^^^^^^^-------------- the outer for loop 
    # do whatever 

इसका मतलब है कि product सिर्फ स्वतंत्र की संख्या कम करने का एक आसान तरीका है:

for i in range(10): 
    for j in range(8): 
     # do whatever 

यह भी product का उपयोग कर के रूप में लिखा जा सकता है:

उदाहरण के लिए आप इस पाश है है लूप्स के लिए

आप एक product को for -loops के परिवर्तनशील परिवर्तित करना चाहते हैं, तो आप अनिवार्य रूप से दो कदम की जरूरत है:

# Create the "values" each for-loop iterates over 
loopover = [range(s) for s in shape] 

# Unpack the list using "*" operator because "product" needs them as 
# different positional arguments: 
prod = itertools.product(*loopover) 

for idx in prod: 
    i_0, i_1, ..., i_n = idx # index is a tuple that can be unpacked if you know the number of values. 
           # The "..." has to be replaced with the variables in real code! 
    # do whatever 

कि बराबर है करने के लिए:

for i_1 in range(shape[0]): 
    for i_2 in range(shape[1]): 
     ... # more loops 
      for i_n in range(shape[n]): # n is the length of the "shape" object 
       # do whatever 
+0

आपको इसकी आवश्यकता नहीं है।'[I, j, k, l] 'का उपयोग करके इंडेक्सिंग' [(i, j, k, l)] के बराबर है और 'idx' सिर्फ' (i, j, k, l) है' तो आप बस 'डेटासेट [idx]' के साथ इसे इंडेक्स (जैसा दिखाया गया है)। :) – MSeifert

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