2010-08-02 14 views
22

मैं सरणी के दो आयामी numpy सरणी बनाना चाहता हूं जिसमें प्रत्येक पंक्ति पर तत्वों की एक अलग संख्या हो।एक भिन्न पंक्ति आकार के साथ एक बहुआयामी numpy सरणी बनाने के लिए कैसे?

cells = numpy.array([[0,1,2,3], [2,3,4]]) 

कोशिश कर रहा Numpy जानता है जबकि मनमाने ढंग से वस्तुओं की सरणियों के बारे में, यह भी निश्चित आयामों के साथ संख्या के सजातीय सरणियों के अनुरूप होता है एक त्रुटि

ValueError: setting an array element with a sequence. 

उत्तर

17

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

तुम सच में, लचीला NumPy सरणी चाहते हैं कुछ इस तरह का उपयोग करते हैं:

numpy.array([[0,1,2,3], [2,3,4]], dtype=object) 

हालांकि इस एक आयामी सरणी कि सूचियों के लिए संदर्भ संग्रहीत करता है, जिसका अर्थ है कि आप के लाभों के सबसे खो देंगे पैदा करेगा बेवकूफ (वेक्टर प्रसंस्करण, इलाके, टुकड़ा, आदि)।

12

यह नम्पी में अच्छी तरह से समर्थित नहीं है (परिभाषा के अनुसार, लगभग हर जगह, एक "दो आयामी सरणी" में बराबर लंबाई की सभी पंक्तियां होती हैं)। NumPy सरणी के एक अजगर सूची आपके लिए एक अच्छा समाधान हो सकता है इस तरह के रूप में आप Numpy के फायदे जहाँ आप उन्हें इस्तेमाल कर सकते हैं मिल जाएगा,:,

cells = [numpy.array(a) for a in [[0,1,2,3], [2,3,4]]] 
12

अब हम लगभग 7 साल के बाद प्रश्न पूछा गया था रहे हैं और अपने कोड

cells = numpy.array([[0,1,2,3], [2,3,4]]) 

numpy 1.12.0, अजगर 3.5 में मार डाला, किसी भी त्रुटि का उत्पादन नहीं करता और cells शामिल हैं:

array([[0, 1, 2, 3], [2, 3, 4]], dtype=object) 

आप अपनी cells तत्व cells[0][2] # (=2) के रूप में।

tom10 के समाधान अगर आप नए तत्व (यानी सरणियों) के रूप में फ्लाई पर NumPy सरणी की अपनी सूची का निर्माण करना चाहते करने के लिए एक विकल्प उपलब्ध हो append उपयोग करने के लिए है:

d = []     # initialize an empty list 
a = np.arange(3)  # array([0, 1, 2]) 
d.append(a)   # [array([0, 1, 2])] 
b = np.arange(3,-1,-1) #array([3, 2, 1, 0]) 
d.append(b)   #[array([0, 1, 2]), array([3, 2, 1, 0])] 
+0

समस्या यह है कि आप अभी भी d.mean(), d.flatten() इत्यादि का उपयोग नहीं कर सकते हैं। – episodeyang

1

एक अन्य विकल्प स्टोर करने के लिए किया जाएगा आपके सरणी एक संगत सरणी के रूप में और अपने आकार या ऑफसेट भी स्टोर करते हैं। यह आपके सरणी पर काम करने के तरीके के बारे में थोड़ा और वैचारिक विचार लेता है, लेकिन काम करने के लिए आश्चर्यजनक रूप से बड़ी संख्या में संचालन किए जा सकते हैं जैसे कि आपके पास विभिन्न आकारों के साथ दो आयामी सरणी थी। जिन मामलों में वे नहीं कर सकते हैं, तो np.split का उपयोग कैलोक्सेरस की सूची बनाने के लिए किया जा सकता है। सबसे आसान संचालन ufuncs हैं, क्योंकि उन्हें लगभग कोई संशोधन की आवश्यकता नहीं है। यहां कुछ उदाहरण दिए गए हैं:

cells_flat = numpy.array([0, 1, 2, 3, 2, 3, 4]) 
# One of these is required, it's pretty easy to convert between them, 
# but having both makes the examples easy 
cell_lengths = numpy.array([4, 3]) 
cell_starts = numpy.insert(cell_lengths[:-1].cumsum(), 0, 0) 
cell_lengths2 = numpy.diff(numpy.append(cell_starts, cells_flat.size)) 
assert np.all(cell_lengths == cell_lengths2) 

# Copy prevents shared memory 
cells = numpy.split(cells_flat.copy(), cell_starts[1:]) 
# [array([0, 1, 2, 3]), array([2, 3, 4])] 

numpy.array([x.sum() for x in cells]) 
# array([6, 9]) 
numpy.add.reduceat(cells_flat, cell_starts) 
# array([6, 9]) 

[a + v for a, v in zip(cells, [1, 3])] 
# [array([1, 2, 3, 4]), array([5, 6, 7])] 
cells_flat + numpy.repeat([1, 3], cell_lengths) 
# array([1, 2, 3, 4, 5, 6, 7]) 

[a.astype(float)/a.sum() for a in cells] 
# [array([ 0.  , 0.16666667, 0.33333333, 0.5  ]), 
# array([ 0.22222222, 0.33333333, 0.44444444])] 
cells_flat.astype(float)/np.add.reduceat(cells_flat, cell_starts).repeat(cell_lengths) 
# array([ 0.  , 0.16666667, 0.33333333, 0.5  , 0.22222222, 
#   0.33333333, 0.44444444]) 

def complex_modify(array): 
    """Some complicated function that modifies array 

    pretend this is more complex than it is""" 
    array *= 3 

for arr in cells: 
    complex_modify(arr) 
cells 
# [array([0, 3, 6, 9]), array([ 6, 9, 12])] 
for arr in numpy.split(cells_flat, cell_starts[1:]): 
    complex_modify(arr) 
cells_flat 
# array([ 0, 3, 6, 9, 6, 9, 12]) 
संबंधित मुद्दे