2013-02-01 20 views
37

मैं पाइथन के लिए एक पूर्ण रूकी हूं, लेकिन ऐसा लगता है कि एक दी गई स्ट्रिंग मनमाने ढंग से लंबाई (प्रभावी ढंग से) होने में सक्षम है। अर्थात। आप string str ले सकते हैं और इसे जोड़ते रह सकते हैं: str += "some stuff..."। क्या इस तरह के तारों की सरणी बनाने का कोई तरीका है?मनमानी लंबाई तारों की पायथन numpy सरणी

जब मैं यह कोशिश, प्रत्येक तत्व केवल एक ही चरित्र

strArr = numpy.empty(10, dtype='string') 
for i in range(0,10) 
    strArr[i] = "test" 

दूसरी ओर, मैं जानता हूँ कि मैं निश्चित लंबाई तार की एक सरणी को प्रारंभ कर सकते हैं पर, यानी

strArr = numpy.empty(10, dtype='s256') 

संग्रहीत करता है जो कर सकते हैं 256 वर्णों के 10 स्ट्रिंग्स स्टोर करें

उत्तर

68

आप dtype=object की एक सरणी बनाकर ऐसा कर सकते हैं। आप एक सामान्य numpy सरणी के लिए एक लंबी स्ट्रिंग आवंटित करने के लिए प्रयास करते हैं तो यह स्ट्रिंग ट्रंकेटस:

>>> a = numpy.array(['apples', 'foobar', 'cowboy']) 
>>> a[2] = 'bananas' 
>>> a 
array(['apples', 'foobar', 'banana'], 
     dtype='|S6') 

लेकिन जब आप dtype=object उपयोग करते हैं, आप अजगर वस्तु संदर्भ की एक सरणी मिलता है। तो तुम सब अजगर तार के व्यवहार हो सकता है:

>>> a = numpy.array(['apples', 'foobar', 'cowboy'], dtype=object) 
>>> a 
array([apples, foobar, cowboy], dtype=object) 
>>> a[2] = 'bananas' 
>>> a 
array([apples, foobar, bananas], dtype=object) 

दरअसल, क्योंकि यह ऑब्जेक्ट की श्रृंखला है, तो आप निर्दिष्ट कर सकते हैं सरणी के लिए अजगर वस्तु के किसी भी तरह:

>>> a[2] = {1:2, 3:4} 
>>> a 
array([apples, foobar, {1: 2, 3: 4}], dtype=object) 

हालांकि, इससे numpy का उपयोग करने के कई फायदे सामने आते हैं, जो इतनी तेज़ है क्योंकि यह कच्ची मेमोरी के बड़े संगत ब्लॉक पर काम करता है। अजगर वस्तुओं के साथ काम करना बहुत अधिक उपर जोड़ता है। एक साधारण उदाहरण:

>>> a = numpy.array(['abba' for _ in range(10000)]) 
>>> b = numpy.array(['abba' for _ in range(10000)], dtype=object) 
>>> %timeit a.copy() 
100000 loops, best of 3: 2.51 us per loop 
>>> %timeit b.copy() 
10000 loops, best of 3: 48.4 us per loop 
+0

धन्यवाद, आपका पहला उदाहरण विशेष रूप से सहायक है - मैंने कभी उस व्यवहार का अनुमान नहीं लगाया होगा! मैं इस वस्तु के लिए गति के बारे में चिंतित नहीं हूं, इसलिए धीमी पहुंच ठीक होनी चाहिए। – DilithiumMatrix

+1

अच्छा जवाब। मैंने डेमो के साथ एक पाइथन नोटबुक पेज में एक लिंक शामिल किया है, मैं numpy सरणी निर्माण के बारे में काम कर रहा हूं। –

11

आप ऑब्जेक्ट डेटा प्रकार का उपयोग कर सकते हैं:

>>> import numpy 
>>> s = numpy.array(['a', 'b', 'dude'], dtype='object') 
>>> s[0] += 'bcdef' 
>>> s 
array([abcdef, b, dude], dtype=object) 
संबंधित मुद्दे