2012-05-19 7 views
23

का उपयोग कर 3 डी सरणी बनाएँ मैं इस तरह उपयोग करने के लिए अजगर (2.7) में एक 3 डी सरणी बनाने के लिए करना चाहते हैं:अजगर

distance[i][j][k] 

और सरणी के आकार एक चर रहा है के आकार का होना चाहिए। (N * n * एन)

मैं उपयोग करने की कोशिश:

distance = [[[]*n]*n] 

लेकिन यह है कि काम करने के लिए नहीं मालूम था।

कोई विचार? आपका बहुत बहुत धन्यवाद!

संपादित करें: मैं केवल डेफल्ट पुस्तकालयों का उपयोग कर सकता हूं, और गुणा करने की विधि (यानी [[0] * एन] * एन) काम नहीं करेगा क्योंकि वे एक ही सूचक से जुड़े हुए हैं और मुझे सभी मानों की आवश्यकता है व्यक्तिगत

EDIT2: पहले से ही उत्तर द्वारा हल किया गया है।

+0

मानक 'सरणी' मॉड्यूल की 'सरणी' कक्षा का उपयोग करने पर विचार करें। – martineau

उत्तर

44

आप का उपयोग करना चाहिए एक list comprehension:

>>> import pprint 
>>> n = 3 
>>> distance = [[[0 for k in xrange(n)] for j in xrange(n)] for i in xrange(n)] 
>>> pprint.pprint(distance) 
[[[0, 0, 0], [0, 0, 0], [0, 0, 0]], 
[[0, 0, 0], [0, 0, 0], [0, 0, 0]], 
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]] 
>>> distance[0][1] 
[0, 0, 0] 
>>> distance[0][1][2] 
0 

आप एक बयान है कि एक आप की कोशिश की तरह देखा के साथ एक डेटा संरचना का उत्पादन किया जा सकता था, लेकिन यह साइड इफेक्ट्स होते क्योंकि आंतरिक सूचियां कॉपी-बाय-आर होती हैं eference:

>>> distance=[[[0]*n]*n]*n 
>>> pprint.pprint(distance) 
[[[0, 0, 0], [0, 0, 0], [0, 0, 0]], 
[[0, 0, 0], [0, 0, 0], [0, 0, 0]], 
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]] 
>>> distance[0][0][0] = 1 
>>> pprint.pprint(distance) 
[[[1, 0, 0], [1, 0, 0], [1, 0, 0]], 
[[1, 0, 0], [1, 0, 0], [1, 0, 0]], 
[[1, 0, 0], [1, 0, 0], [1, 0, 0]]] 
+0

धन्यवाद, यह ठीक काम करता प्रतीत होता है। मैं अपने कार्यक्रम में परीक्षण करूंगा और परिणामों के साथ जल्द ही वापस आऊंगा। –

5

सही तरीके से

[[[0 for _ in range(n)] for _ in range(n)] for _ in range(n)] 

होगा (आपको बस इतना करना (NxNxN के लिए)

[[[0]*n]*n]*n 

की तरह लिखा जाना चाहिए कोशिश कर रहे हैं लेकिन यह है कि सही नहीं है क्या, टिप्पणी @Adaman क्यों देखते हैं)।

+0

अच्छा नहीं है। इसमें एक ही सरणी के संदर्भ होंगे। इसे आज़माएं: 'ए = [[0] * 3] * 3; एक [0] [0] = 1; एक – Amadan

21

numpy.array रों सिर्फ इस मामले के लिए तैयार कर रहे हैं:

numpy.zeros((i,j,k)) 

आप आयाम की एक सरणी मैं जे कश्मीर, शून्य से भर दे देंगे।

आपको इसके लिए क्या चाहिए, numpy आपकी आवश्यकताओं के लिए सही लाइब्रेरी हो सकती है।

+0

प्रिंट करें धन्यवाद, मैं यह –

+0

ओह कोशिश करूंगा, ओह, मैंने सोचा कि यह बहरा पुस्तकालयों में से एक था। मैं इसके अलावा कुछ भी नहीं उपयोग कर सकता। –

+1

नहीं, दुर्भाग्य से यह एक बाहरी पुस्तकालय है। लेकिन आमतौर पर यदि आपको संख्यात्मक डेटा के बड़े (बड़े) सरणी को संसाधित करने की आवश्यकता होती है तो बेहद उपयुक्त है। विशेष रूप से अगर गति एक मुद्दा है। – mata

0

यदि आप खाली के रूप में शुरू होने वाली हर चीज पर जोर देते हैं, तो आपको [] []] के बजाय अंदरूनी ([[]] के अतिरिक्त सेट की आवश्यकता है, क्योंकि यह "एक सूची है जिसमें डुप्लिकेट करने के लिए 1 खाली सूची है" के विपरीत "कुछ नहीं युक्त एक सूची नकल करने"):

distance=[[[[]]*n]*n]*n 
+1

ऐसा मत करो, या वे सभी एक ही संदर्भ को इंगित करेंगे! बस 'दूरी [1] [2] [0] .append (1) ' –

+0

हां, इसके साथ मेरी समस्या यह है कि यदि मैं उनमें से एक को बदलता हूं, तो यह उन सभी को भी बदल देगा। मुझे उन्हें अलग तत्व होने की जरूरत है। –

2
d3 = [[[0 for col in range(4)]for row in range(4)] for x in range(6)] 

d3[1][2][1] = 144 

d3[4][3][0] = 3.12 

for x in range(len(d3)): 
    print d3[x] 



[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] 
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 144, 0, 0], [0, 0, 0, 0]] 
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] 
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] 
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [3.12, 0, 0, 0]] 
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] 
+0

'col',' row' और 'x' स्पष्टीकरण के लिए धन्यवाद! – Gluttton

0
def n_arr(n, default=0, size=1): 
    if n is 0: 
     return default 

    return [n_arr(n-1, default, size) for _ in range(size)] 

arr = n_arr(3, 42, 3) 
assert arr[2][2][2], 42 
3
""" 
Create 3D array for given dimensions - (x, y, z) 

@author: Naimish Agarwal 
""" 


def three_d_array(value, *dim): 
    """ 
    Create 3D-array 
    :param dim: a tuple of dimensions - (x, y, z) 
    :param value: value with which 3D-array is to be filled 
    :return: 3D-array 
    """ 

    return [[[value for _ in xrange(dim[2])] for _ in xrange(dim[1])] for _ in xrange(dim[0])] 

if __name__ == "__main__": 
    array = three_d_array(False, *(2, 3, 1)) 
    x = len(array) 
    y = len(array[0]) 
    z = len(array[0][0]) 
    print x, y, z 

    array[0][0][0] = True 
    array[1][1][0] = True 

    print array 

बहुआयामी सरणियों के लिए numpy.ndarray उपयोग करने के लिए पसंद करते हैं।