2013-11-27 12 views
6

को दोबारा नहीं बदल सकता है मेरे पास एक ऐसा फ़ंक्शन है जो पूर्णांक की 1 डी सरणी लेता है और इसे 1x3 सरणी के 2 डी सरणी में आकार देता है। यह तब प्रत्येक 1x3 सरणी लेना और इसे 3x1 सरणी में स्थानांतरित करना है। नतीजा 3x1 सरणी का 2 डी सरणी माना जाता है। यहां मेरा फ़ंक्शनnumpy array

def RGBtoLMS(rgbValues, rgbLength): #Method to convert from RGB to LMS 
    print rgbValues 
    lmsValues = rgbValues.reshape(-1, 3) 
    print lmsValues 
    for i in xrange(len(lmsValues)): 
     lmsValues[i] = lmsValues[i].reshape(3, 1) 

    return lmsValues 

समस्या तब बढ़ती है जब मैं 1x3 सरणी को 3x1 सरणी में बदलने की कोशिश करता हूं। मैं निम्नलिखित उत्पादन संभालने rgbValues ​​= [14, 25, 19, 24, 25, 28, 58, 87, 43]

[14 25 19 ..., 58 87 43] 
[[14 25 19] 
[24, 25, 28] 
[58 87 43]] 

ValueError [on line lmsValues[i] = lmsValues[i].reshape(3, 1)]: could not broadcast input array from shape (3,1) into shape (3) 

मैं कैसे इस त्रुटि से बचने कर सकते हैं?

+1

जब आप कहते हैं कि 1x3 सरणियों के 2 डी सरणी, यह आकार की है (, एन, एन 1, 3)? यहां एक उदाहरण स्पष्टीकरण में मदद कर सकता है! –

+1

मुख्य मुद्दा यह है कि 'lmsValues' की प्रत्येक प्रविष्टि में पहले से ही एक निर्दिष्ट आकार है, इसलिए किसी भिन्न आकार के साथ कुछ असाइन करने की अनुमति नहीं है। हालांकि, मैं आपके इनपुट के एक साधारण उदाहरण की तुलना में @ एंडीहेडन से सहमत हूं और अपेक्षित आउटपुट आपके प्रश्न का उत्तर देने में सहायक होगा। – cm2

+0

संपादित, अब यह अधिक स्पष्ट होना चाहिए –

उत्तर

5

जैसा कि टिप्पणियों में बताया गया है, आप वास्तव में हमेशा अलग-अलग आकारों के साथ एक सरणी को संशोधित कर रहे हैं। यह वास्तव में यह कहने के लिए समझ में नहीं आता है कि आपके पास 1 x 3 सरणी का 2 डी सरणी है। वास्तव में यह वास्तव में n x 3 सरणी है।

>>> import numpy as np 

>>> rgbValues = np.array([14, 25, 19, 24, 25, 28, 58, 87, 43, 1, 2, 3]) 
>>> rgbValues.shape 
(12,) 

और यह नयी आकृति प्रदान n x 3 होने के लिए:

हम लंबाई 3*n (मैं एक 3 x n और n x 3 सरणी स्पष्ट के बीच अंतर करने के लिए अपने उदाहरण के लिए तीन नंबर जोड़ दिया है) के एक 1 दिन सरणी के साथ शुरू:

>>> lmsValues = rgbValues.reshape(-1, 3) 
>>> lmsValues 
array([[14, 25, 19], 
     [24, 25, 28], 
     [58, 87, 43], 
     [ 1, 2, 3]]) 
>>> lmsValues.shape 
(4, 3) 

यदि आप चाहते हैं प्रत्येक तत्व के आकार का होने के लिए 3 x 1, शायद तुम सिर्फ सरणी स्थानांतरित करने के लिए चाहते हैं। इस पंक्तियों और स्तंभों स्विच, इसलिए आकार 3 x n

>>> lmsValues.T 
array([[14, 24, 58, 1], 
     [25, 25, 87, 2], 
     [19, 28, 43, 3]]) 

>>> lmsValues.T.shape 
(3, 4) 

>>> lmsValues.T[0] 
array([14, 24, 58, 1]) 

>>> lmsValues.T[0].shape 
(4,) 

है आप वास्तव में प्रत्येक तत्व lmsValues में चाहते हैं एक 1 x 3 सरणी होने के लिए, आप ऐसा कर सकते हैं, लेकिन फिर इसे आकार के साथ एक 3 डी सरणी हो गया है n x 1 x 3:

>>> lmsValues = rgbValues.reshape(-1, 1, 3) 
>>> lmsValues 
array([[[14, 25, 19]], 

     [[24, 25, 28]], 

     [[58, 87, 43]], 

     [[ 1, 2, 3]]]) 

>>> lmsValues.shape 
(4, 1, 3) 

>>> lmsValues[0] 
array([[14, 25, 19]]) 

>>> lmsValues[0].shape 
(1, 3) 
+1

वास्तव में, 1x3 सरणी का 2 डी सरणी एक 4 डी सरणी होगी। या यह 'dtype = object' का 2 डी सरणी हो सकता है जहां प्रत्येक तत्व 2 डी 1x3 सरणी है। वे दोनों निश्चित रूप से करने योग्य हैं। लेकिन कोई भी ऐसा कुछ नहीं लगता जो ओपी वास्तव में करना चाहता है; मुझे लगता है कि यह जवाब वह वास्तव में _wants_ है, भले ही वह उसे नहीं जानता। – abarnert

+0

हाहा, अर्थात्, मुझे लगता है कि आप सही हैं, @ बार्नर्ट, लेकिन क्या इसमें आकार परिवर्तन शामिल नहीं होगा? या, मुझे लगता है कि यह '(एन, 1, 1, 3)', हो सकता है। लेकिन हाँ, मेरा अनुमान है कि वह स्थान है जिसके बाद वह है। – askewchan

+0

हां, आकार बदलने के बिना, '(एन, 1, 1, 3)'। या '(1, एन, 1, 3)'। क्या प्रत्येक आयाम को एक बार उठाना या पंक्ति में दो बार समान आयाम को सूचीबद्ध करना अधिक अनुचित है? यह निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं, और मुझे नहीं पता कि वह क्यों कहता है कि वह 2x3 सरणी की 2 डी सरणी चाहता है। (विशेष रूप से जब से मुझे नहीं लगता कि वह वास्तव में चाहता है, वह 1x3 सरणी की एक 1 डी सरणी चाहता है, जैसा आपने उसे दिया है।) – abarnert