numpy

2012-06-05 13 views
5

एक सरणी को देखते हुए में subarrays बदलें,numpy

>>> n = 2 
>>> a = numpy.array([[[1,1,1],[1,2,3],[1,3,4]]]*n) 
>>> a 
array([[[1, 1, 1], 
     [1, 2, 3], 
     [1, 3, 4]], 

     [[1, 1, 1], 
     [1, 2, 3], 
     [1, 3, 4]]]) 

मुझे पता है कि यह इतना तरह संक्षेप में यह मान बदलने के लिए संभव है,

>>> a[a==2] = 0 
>>> a 
array([[[1, 1, 1], 
     [1, 0, 3], 
     [1, 3, 4]], 

     [[1, 1, 1], 
     [1, 0, 3], 
     [1, 3, 4]]]) 

यह एक पूरी पंक्ति के लिए भी ऐसा ही करना संभव है सरणी में (अंतिम धुरी)? मुझे पता है कि a[a==[1,2,3]] = 11 11 के साथ मिलान करने वाले उपनगरों के सभी तत्वों को काम करेगा और प्रतिस्थापित करेगा, लेकिन मैं एक अलग सबएरे को प्रतिस्थापित करना चाहता हूं। मेरे अंतर्ज्ञान मुझसे कहता निम्नलिखित लिखने के लिए, लेकिन एक त्रुटि परिणाम,

>>> a[a==[1,2,3]] = [11,22,33] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: array is not broadcastable to correct shape 

सारांश में, मैं क्या प्राप्त करना चाहते हैं है: है, में

array([[[1, 1, 1], 
     [11, 22, 33], 
     [1, 3, 4]], 

     [[1, 1, 1], 
     [11, 22, 33], 
     [1, 3, 4]]]) 

... और n के पाठ्यक्रम सामान्य, 2 से बहुत बड़ा, और अन्य अक्ष 3 से भी बड़े होते हैं, इसलिए यदि मुझे आवश्यकता नहीं है तो मैं उन पर लूप नहीं करना चाहता हूं।


अद्यतन: [1,2,3] (अन्यथा मैं तलाश कर रहा हूँ जो कुछ भी) हमेशा सूचकांक 1. एक उदाहरण में नहीं है:

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

उत्तर

2

आपको जो कुछ चाहिए उसे प्राप्त करने के लिए आपको कुछ और जटिल करना है।

आप इस तरह के सरणी के स्लाइस का चयन नहीं कर सकते हैं, लेकिन आप अपनी इच्छित सभी विशिष्ट इंडेक्स का चयन कर सकते हैं।

तो सबसे पहले आपको उन सरणी का निर्माण करने की आवश्यकता है जो पंक्तियों का प्रतिनिधित्व करते हैं जिन्हें आप चुनना चाहते हैं। अर्थात।

data = numpy.array([[1,2,3],[55,56,57],[1,2,3]]) 

to_select = numpy.array([1,2,3]*3).reshape(3,3) # three rows of [1,2,3] 

selected_indices = data == to_select 
# array([[ True, True, True], 
#  [False, False, False], 
#  [ True, True, True]], dtype=bool) 

data = numpy.where(selected_indices, [4,5,6], data) 
# array([[4, 5, 6], 
#  [55, 56, 57], 
#  [4, 5, 6]]) 

# done in one step, but perhaps not very clear as to its intent 
data = numpy.where(data == numpy.array([1,2,3]*3).reshape(3,3), [4,5,6], data) 

numpy.where दूसरा तर्क अगर सही है और तीसरा तर्क अगर झूठे से चयन करके काम करता है।

आप 3 विभिन्न प्रकार के डेटा से चयन करने के लिए कहां उपयोग कर सकते हैं। पहला एक सरणी है जिसमें selected_indices के समान आकार है, दूसरा केवल अपने ही मूल्य (जैसे 2 या 7) है। पहला सबसे जटिल है क्योंकि आकार का हो सकता है जिसे selected_indices के समान आकार में प्रसारित किया जा सकता है। इस मामले में हमने [1,2,3] प्रदान किया जिसे आकार 3x3 के साथ सरणी प्राप्त करने के लिए एक साथ रखा जा सकता है।

+0

शानदार! मैंने 'कहाँ' के बारे में नहीं सोचा था। – Karol

0

नोट यकीन है कि अगर यह तुम क्या चाहते हो, तो आपका कोड उदाहरण वह सरणी नहीं बनाती जिसे आप कहते हैं। लेकिन:

>>> a = np.array([[[1,1,1],[1,2,3],[1,3,4]], [[1,1,1],[1,2,3],[1,3,4]]]) 
>>> a 
array([[[1, 1, 1], 
     [1, 2, 3], 
     [1, 3, 4]], 

     [[1, 1, 1], 
     [1, 2, 3], 
     [1, 3, 4]]]) 
>>> a[:,1,:] = [[8, 8, 8], [8,8,8]] 
>>> a 
array([[[1, 1, 1], 
     [8, 8, 8], 
     [1, 3, 4]], 

     [[1, 1, 1], 
     [8, 8, 8], 
     [1, 3, 4]]]) 
>>> a[:,1,:] = [88, 88, 88] 
>>> a 
array([[[ 1, 1, 1], 
     [88, 88, 88], 
     [ 1, 3, 4]], 

     [[ 1, 1, 1], 
     [88, 88, 88], 
     [ 1, 3, 4]]]) 
+0

आप सही हैं, मेरे प्रश्न में एक गलती थी ... अब इसे ठीक कर दिया। आपका समाधान मेरे विशिष्ट उदाहरण के लिए काम करता है, लेकिन '[1,2,3]' हमेशा इंडेक्स '1' पर नहीं होगा, इसलिए' a [:, 1,:] 'ऐसा कुछ नहीं है जो सामान्य रूप से काम करेगा। उदाहरण के लिए, इस सरणी को लें: 'a = numpy.array ([[[1,1,1], [1,2,3], [1,3,4]], [[1,2,3], [1,1,1], [1,3,4]]]) '। मुझे उन स्थानों को खोजने की ज़रूरत है जहां '[1,2,3]' होता है। – Karol

2

आप एक बहुत अधिक प्रदर्शन करता है, तो सभी स्तंभों अपने तुलना के लिए एक True मूल्य की जाँच करने के np.all उपयोग करने के साथ इस लक्ष्य को हासिल कर सकते हैं, तो बनाया मुखौटा का उपयोग कर मूल्यों को बदलने के लिए:

mask = np.all(a==[1,2,3], axis=2) 
a[mask] = [11, 22, 23] 

print(a) 
#array([[[ 1, 1, 1], 
#  [11, 22, 33], 
#  [ 1, 3, 4]], 
# 
#  [[ 1, 1, 1], 
#  [11, 22, 33], 
#  [ 1, 3, 4]]]) 

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