2012-12-05 13 views
15

की एक संख्यात्मक सरणी शुरू करने के अजीब व्यवहार में अजीब के साथ कुछ प्रतीत होता है जब सरणी में स्ट्रिंग डेटा होता है। मैं निम्नलिखित कोड है: जब मैं print my_array[0, :] साथ इसे प्रिंट, अबस्ट्रिंग डेटा

my_array = numpy.empty([1, 2], dtype = str) 
my_array[0, 0] = "Cat" 
my_array[0, 1] = "Apple" 

, प्रतिक्रिया मैं ['C', 'A'] जो स्पष्ट रूप से बिल्ली और एप्पल की उम्मीद उत्पादन नहीं है,। वह क्यों है, और मैं सही आउटपुट कैसे प्राप्त कर सकता हूं?

धन्यवाद!

उत्तर

28

Numpy को निश्चित अधिकतम लंबाई रखने के लिए स्ट्रिंग सरणी की आवश्यकता होती है। जब आप dtype=str के साथ एक खाली सरणी बनाते हैं, तो यह डिफ़ॉल्ट रूप से यह अधिकतम लंबाई 1 तक सेट करता है। आप देख सकते हैं कि क्या आप my_array.dtype करते हैं; यह "| एस 1" दिखाएगा, जिसका अर्थ है "एक-वर्ण स्ट्रिंग"। इस संरचना को फिट करने के लिए सरणी में बाद के असाइनमेंट को छोटा कर दिया जाता है।

आप एक स्पष्ट डेटाप्रकार अपनी अधिकतम लंबाई के साथ ऐसा करके, उदा "S10" पारित कर सकते हैं .:

my_array = numpy.empty([1, 2], dtype="S10") 

लंबाई-10 तार की एक सरणी का निर्माण करेगा। आपको यह तय करना होगा कि आप जिस डेटा को पकड़ना चाहते हैं उसे पकड़ने के लिए कितना बड़ा होगा।

+0

यह सही है, जानना अच्छा है! धन्यवाद – Jim

+0

एक बार जब मैं सूची में एक तत्व अद्यतन करता हूं (i.e 'my_array [0] = 'हैलो''), क्या उस पहले तत्व में आवंटित स्मृति के" 10-अक्षर योग्य "हैं? या अब यह वास्तव में एक '" एस 5 "वस्तु है? मुझे नहीं लगता है, क्योंकि 'numpy' सरणी का' dtype' पूरे सरणी में सुसंगत होना चाहिए? – Anonymous

+0

@jphollowed: दाएं, आकार पूरे सरणी के लिए तय किया गया है, इसलिए यदि आप इसे S10 के रूप में प्रारंभ करते हैं, तो यह अभी भी प्रत्येक प्रविष्टि के लिए 10 बाइट्स का उपयोग करेगा, भले ही आपके द्वारा संग्रहीत वास्तविक स्ट्रिंग छोटे हों। – BrenBarn

2

मैं जब मैं dtype="S10"

के साथ एक गैर-ascii चरित्र का उपयोग करने के तुम भी द्विआधारी तार है, जो मुझे उलझन के साथ एक सरणी प्राप्त करने की कोशिश की एक "कोडेक त्रुटि" मिला है।

मुझे लगता है कि इसका इस्तेमाल करने के लिए बेहतर है:

my_array = numpy.empty([1, 2], dtype="<U10")

1

numpy स्ट्रिंग सरणी अपने निर्धारित लंबाई (डिफ़ॉल्ट रूप से लंबाई 1) द्वारा सीमित है। आप क्या लंबाई में आप पहले से तार के लिए की आवश्यकता होगी अनिश्चित हैं, तो आप dtype=object का उपयोग करें और अपने डेटा तत्वों के लिए मनमाने ढंग से लंबाई तार प्राप्त कर सकते हैं:

my_array = numpy.empty([1, 2], dtype=object) 

मैं समझता हूँ वहाँ इस दृष्टिकोण के लिए दक्षता कमियां हो सकता है लेकिन मेरे पास इसका समर्थन करने के लिए एक अच्छा संदर्भ नहीं है।

my_array = np.array([["CAT","APPLE"],['','']], dtype=str) 

दूसरे शब्दों में, पहले आप आप क्या चाहते हैं के साथ एक नियमित सरणी लिखते हैं, तो आप इसे एक numpy सरणी में बदल जाते हैं:

+0

क्या कोई चेतावनी है (धीमी गति की तरह) की तुलना में, "एस 10" कहें? – Boern

0

एक अन्य विकल्प के रूप में निम्नानुसार प्रारंभ करने में है। हालांकि, यह आपकी अधिकतम स्ट्रिंग लंबाई को प्रारंभिक रूप से सबसे लंबी स्ट्रिंग की लंबाई तक ठीक करेगा। तो यदि आप

my_array[1,0] = 'PINEAPPLE' 

जोड़ना चाहते थे तो संग्रहित स्ट्रिंग 'पिनईए' होगी।