मुझे कोई दूसरी त्रुटि से आप (numpy 1.7.0.dev का प्रयोग करके) कर मिलती है:
ValueError: setting an array element with a sequence.
तो नीचे दिए गए विवरण के अपने सिस्टम के लिए सही नहीं हो सकता है (या तो यह और भी गलत हो सकता है जो मैं देखता हूं उसके लिए स्पष्टीकरण)।
सबसे पहले, आप देखते हैं कि structured array की एक पंक्ति का अनुक्रमण आप एक numpy.void
वस्तु देता है (data type docs देख)
import numpy as np
dt = np.dtype([('tuple', (int, 2))])
a = np.zeros(3, dt)
print type(a[0]) # = numpy.void
मैं क्या समझ से, void
प्रकार का अजगर सूची की तरह है, क्योंकि यह अलग की वस्तुओं धारण कर सकते हैं डेटा प्रकार, जो समझ में आता है क्योंकि संरचित सरणी में कॉलम अलग-अलग डेटा प्रकार हो सकते हैं।
, तो अनुक्रमण के बजाय, आप पहली पंक्ति बाहर काट, आप एक ndarray
:
print type(a[:1]) # = numpy.ndarray
इस के अनुरूप है कैसे अजगर सूचियों के काम:
b = [1, 2, 3]
print b[0] # 1
print b[:1] # [1]
स्लाइसिंग एक छोटा संस्करण रिटर्न मूल अनुक्रम का, लेकिन अनुक्रमण एक तत्व देता है (यहां, int
; ऊपर, void
प्रकार)।
तो जब आप संरचित सरणी की पंक्तियों में फिसलते हैं, तो आपको इसकी अपेक्षा करना चाहिए कि यह आपकी मूल सरणी (केवल कम पंक्तियों के साथ) जैसा व्यवहार करे। अपने उदाहरण के साथ सतत, अब आप पहली पंक्ति की 'टपल' कॉलम के लिए प्रदान कर सकते हैं:
a[:1]['tuple'] = (1, 2)
तो, ... क्यों नहीं a[0]['tuple'] = (1, 2)
काम करता है?
ठीक है, याद रखें कि a[0]
void
ऑब्जेक्ट देता है। इसलिए, जब आप
a[0]['tuple'] = (1, 2) # this line fails
फोन आपको लगता है कि void
वस्तु की 'टपल' तत्व के लिए एक tuple
बताए जा रहे हैं। नोट: इस तथ्य के बावजूद आप इस सूचकांक 'टपल' कहा जाता है, यह एक ndarray
के रूप में जमा किया गया था:
print type(a[0]['tuple']) # = numpy.ndarray
तो, यह मतलब है टपल एक ndarray
में डाला जाना चाहिए। लेकिन, void
ऑब्जेक्ट असाइनमेंट नहीं डाला जा सकता है (यह केवल एक अनुमान है) क्योंकि इसमें मनमाना डेटा प्रकार हो सकते हैं, इसलिए यह नहीं पता कि किस प्रकार कास्ट करना है।इस के आसपास पाने के लिए आप इनपुट अपने आप को कास्ट कर सकते हैं:
a[0]['tuple'] = np.array((1, 2))
तथ्य यह है कि हम विभिन्न त्रुटियों मिल पता चलता है कि इसके बाद के संस्करण लाइन पतों त्रुटि मुझे प्राप्त कास्टिंग के बाद से आप के लिए काम नहीं कर सकते --- नहीं जिसका आप प्राप्त ।
परिशिष्ट:
तो क्यों निम्नलिखित काम करता है?
a[0]['tuple'][:] = (1, 2)
यहाँ, आप सरणी में का अनुक्रमण रहे हैं जब आप [:]
जोड़ने के लिए, लेकिन यह है कि बिना, आप void
वस्तु में का अनुक्रमण कर रहे हैं। दूसरे शब्दों में, a[0]['tuple'][:]
कहता है "संग्रहित सरणी के तत्वों को प्रतिस्थापित करें" (जिसे सरणी द्वारा नियंत्रित किया जाता है), a[0]['tuple']
कहता है "संग्रहित सरणी को प्रतिस्थापित करें" (जिसे void
द्वारा प्रबंधित किया जाता है)।
उपसंहार:
अजीब पर्याप्त, पंक्ति (0 के साथ अर्थात अनुक्रमण) तक पहुँचने आधार सरणी ड्रॉप करने लगता है, लेकिन यह अभी भी आप आधार सरणी के लिए आवंटित करने के लिए अनुमति देता है।
print a['tuple'].base is a # = True
print a[0].base is a # = False
a[0] = ((1, 2),) # `a` is changed
शायद void
नहीं वास्तव में एक सरणी तो यह, एक आधार सरणी नहीं है ... लेकिन फिर क्यों यह एक base
विशेषता है?
युक्ति: एसओ को कोड पोस्ट करते समय, कृपया उन बिट्स पोस्ट करें जिन्हें हम कट-पेस्ट कर सकते हैं; पायथन के मामले में, इसका मतलब है कि डाली गई टिप्पणियों के लिए '#' का उपयोग करना, '%' नहीं। – DSM
मजेदार सामान, मैं यह भी 1.6.1 का उपयोग कर एक ही परिणाम दे रहा हूं ... –
थोड़ा अजीब, लेकिन 'एक [0] [' tuple '] [:] = (1,2)' काम करता है, शायद वहाँ एक सुराग है ... –