2012-03-31 20 views
17

क्या यह एक बग है?numpy-wise स्ट्रिंग concatenation numpy

import numpy as np 
a1=np.array(['a','b']) 
a2=np.array(['E','F']) 

In [20]: add(a1,a2) 
Out[20]: NotImplemented 

मैं तत्व-आधारित स्ट्रिंग concatenation करने की कोशिश कर रहा हूँ। मैंने सोचा कि Add() को गंदे में करने का तरीका था लेकिन स्पष्ट रूप से यह उम्मीद के अनुसार काम नहीं कर रहा है।

+1

के रूप में, संख्या संख्या के लिए है। पायथन के पास बहुत अच्छी स्ट्रिंग ऑपरेशंस है। इसका उपयोग क्यों न करें? '" "। जॉइन ([" ए "," बी "]) 'ठीक काम करता है। – Keith

+1

मैं इस http://docs.scipy.org/doc/numpy/reference/routines.char.html – Dave31415

+2

पर देख रहा था यह अच्छा है। लेकिन: "वे सभी पाइथन मानक पुस्तकालय में स्ट्रिंग विधियों पर आधारित हैं।" तो यदि आप केवल मानक लाइब्रेरी का उपयोग करते हैं तो आप कोड लिख सकते हैं जो numpy पर निर्भर नहीं है। – Keith

उत्तर

30

यह numpy.core.defchararray.add का उपयोग किया जा सकता है। यहाँ एक उदाहरण है:

>>> import numpy as np 
>>> a1 = np.array(['a', 'b']) 
>>> a2 = np.array(['E', 'F']) 
>>> np.core.defchararray.add(a1, a2) 
array(['aE', 'bF'], 
     dtype='<U2') 

वहाँ अन्य रहे हैं NumPy डेटा प्रकार के लिए उपयोगी string operations उपलब्ध।

+0

आपके द्वारा लिंक किए गए 'add' स्ट्रिंग ऑपरेशंस को पायथन 3.2 के तहत numpy 1.6.1 के लिए' अस्वीकृत '(प्रश्न में) प्रदान करता है। क्या आप जानते हैं कि कौन सा संस्करण लागू किया गया है? –

+0

@ फ्रांसेस्कोमोन्टेसैनो उबंटू 12.04.2 एलटीएस पर उस संस्करण संयोजन के साथ जांच कर रहा है, मेरे उत्तर में उदाहरण अपेक्षित काम करता है। आम तौर पर, 'np.add' का उपयोग करके किसी भी संस्करण के साथ' NotImplemented' भी बढ़ाया जाता है। सुनिश्चित करें कि आप 'np.core.defchararray.add' का उपयोग कर रहे हैं। –

+0

अब मैंने दस्तावेज़ों में 'add' का पूरा हस्ताक्षर देखा है (मुझे इससे पहले याद आया)। वैसे भी, अच्छा होगा अगर numpy 'np.core.defchararray। *' को इसी संख्यात्मक ndarray संचालन में लपेट लेगा। मुझे लगता है कि यह बहुत साफ है और 'np.add' करने के लिए याद रखना आसान है। –

4

यह (और चाहिए) शुद्ध पायथन में किया जा सकता है, के रूप numpy भी अजगर स्ट्रिंग परिवर्तन कार्यों आंतरिक रूप से उपयोग करता है:

>>> a1 = ['a','b'] 
>>> a2 = ['E','F'] 
>>> map(''.join, zip(a1, a2)) 
['aE', 'bF'] 
+0

ठीक है, इसलिए मैं जिस ऐड फ़ंक्शन का उपयोग कर रहा था वह numpy में शीर्ष स्तर पर नहीं है। क्या इनमें से कोई भी तेज/बेहतर या किसी भी कारण से पसंद किया गया है? – Dave31415

+7

यह सवाल का जवाब नहीं देता है। ऐसे समय होते हैं जब कोई इसे numpy में करना चाहता है, उदा। स्ट्रिंग के बड़े सरणी के साथ काम करते समय। मूल पोस्टर ने एक साधारण उदाहरण दिया जिसके लिए कोई शुद्ध पायथन का उपयोग करेगा, लेकिन एक सुस्त समाधान मांग रहा था। – Thucydides411

+0

@ Thucydides411 जो मैंने अपने उत्तर लिखने के समय समझा था, उसमें से केवल बिल्टिन पायथन प्राइमेटिव का उपयोग किया गया था, इसलिए मुझे नहीं पता था कि इसका क्या फायदा होगा। सुनिश्चित नहीं है कि यह सच है, ऐसा लगता है कि ऐसा नहीं है। शायद मैंने कथन का गलत व्याख्या किया "वे सभी पाइथन मानक पुस्तकालय में स्ट्रिंग विधियों पर आधारित हैं।" दस्तावेज़ों में –

1

एक अन्य समाधान वस्तुओं के अजगर की विन्यास में, स्ट्रिंग सरणियों कन्वर्ट करने के लिए है ताकि str.add कहा जाता है:

>>> import numpy as np 
>>> a = np.array(['a', 'b', 'c', 'd'], dtype=np.object) 
>>> print a+a 
array(['aa', 'bb', 'cc', 'dd'], dtype=object) 

यह है कि धीमी गति से (दो बार के रूप पूर्णांक सरणियों के रूप में जोड़ने धीमी गति से से भी कम) नहीं है।

7

You can use the chararray subclass तार के साथ सरणी कार्रवाई करने:

a1 = np.char.array(['a', 'b']) 
a2 = np.char.array(['E', 'F']) 

a1 + a2 
#chararray(['aE', 'bF'], dtype='|S2') 

एक और अच्छा उदाहरण: नाम का तात्पर्य

b = np.array([2, 4]) 
a1*b 
#chararray(['aa', 'bbbb'], dtype='|S4') 
+0

दस्तावेज़ों से, _ "नए विकास के लिए इसकी अनुशंसा नहीं की जाती है" _ – Eric

संबंधित मुद्दे