2012-09-30 16 views
15

क्यों कार्यक्रमnumpy.shape असंगत प्रतिक्रिया देता है - क्यों?

import numpy as np 

c = np.array([1,2]) 
print(c.shape) 
d = np.array([[1],[2]]).transpose() 
print(d.shape) 

देता है

(2,) 
(1,2) 
इसके उत्पादन के रूप में

? यह

(1,2) 
(1,2) 

इसके बजाय नहीं होना चाहिए? मुझे यह दोनों पायथन 2.7.3 और पायथन 3.2.3

+4

अन्य लोग दूसरे तरीके से पूछ सकते हैं, इसलिए मुझे लगता है कि आपको यह बताना चाहिए कि आप बाद में क्यों उम्मीद करते हैं। – hakre

+1

आप matlab के बारे में सोच रहे हैं, लेकिन 'सरणी' और 'मैट्रिक्स' के बीच अंतर की जांच करें, numpy में, सरणी बेहतर हैं। – seberg

+1

@ hakre मुझे वास्तव में एक (क्षैतिज) सूची और 1 एक्सएन मैट्रिक्स के बीच कोई अंतर (वास्तविक जीवन में) नहीं दिखता है, इसलिए मुझे सादा सरणी का आकार 1 एक्सएन होना चाहिए - और मुझे उम्मीद है कि डी = [1 , 2] और नहीं [[1, 2]], लेकिन यह देखने के बाद कि यह क्या हो रहा है, इसका तर्क है। – user1710403

उत्तर

1

len(c.shape) सरणी की "गहराई" है।

c के लिए, सरणी बस (एक सदिश) एक सूची, गहराई है 1.
d के लिए है, सरणी सूचियों की एक सूची है, गहराई है 2.

नोट:

c.transpose() 
# array([1, 2]) 

जो d नहीं है, इसलिए यह व्यवहार असंगत नहीं है।

dt = d.transpose() 
# array([[1], 
#  [2]]) 
dt.shape # (2,1) 
14

जब आप एक ndarray की .shape विशेषता आह्वान, आप अपने सरणी के आयाम के रूप में कई तत्वों के साथ एक टपल मिलता है। लंबाई, यानी, पंक्तियों की संख्या, पहले आयाम (shape[0])

  • आप एक सरणी के साथ शुरू होता है: c=np.array([1,2])। यह एक सादा 1 डी सरणी है, इसलिए इसका आकार 1-तत्व ट्यूपल होगा, और shape[0] तत्वों की संख्या है, इसलिए c.shape = (2,)
  • c=np.array([[1,2]]) पर विचार करें। यह 1 पंक्ति के साथ 2 डी सरणी है। पहली और एकमात्र पंक्ति [1,2] है, जो हमें दो कॉलम देती है। इसलिए, c.shape=(1,2) और len(c)=1
  • c=np.array([[1,],[2,]]) पर विचार करें। 2 पंक्तियों के साथ एक और 2 डी सरणी, 1 कॉलम: c.shape=(2,1) और len(c)=2
  • d=np.array([[1,],[2,]]).transpose() पर विचार करें: यह सरणी np.array([[1,2]]) के समान है, इसलिए इसका आकार (1,2) है।

एक अन्य उपयोगी विशेषता .size है: कि सभी आयामों में तत्वों की संख्या है, और आप एक सरणी cc.size = np.product(c.shape) के लिए की है।

documentation में आकार के बारे में अधिक जानकारी।

+1

मेरे पास वास्तव में एक उपयोगी टिप्पणी नहीं है, लेकिन मुझे कहने की आवश्यकता महसूस होती है ... इस तरह के कारण मुझे किसी कारण से ... –

0

transpose सरणी के आयामों की संख्या को नहीं बदलता है। यदि c.ndim == 1, c.transpose() == c। प्रयास करें:

c = np.array([1,2]) 
print c.shape 
print c.T.shape 
c = np.atleast_2d(c) 
print c.shape 
print c.T.shape 
0

त्वरित फिक्स: .ndim संपत्ति की जांच - अगर इसकी 2, फिर .shape संपत्ति के रूप में आप उम्मीद कर काम करेंगे।

कारण क्यों: यदि .ndim संपत्ति 2 है, तो numpy एक आकृति मान की रिपोर्ट करता है जो सम्मेलन से सहमत है। यदि .ndim प्रॉपर्टी 1 है, तो numpy सिर्फ एक अलग तरीके से आकार की रिपोर्ट करता है।

अधिक बात करते समय: जब आप np.array को सूचियों की सूचियां पास करते हैं, तो .shape गुण मैट्रिक्स के आयामों के मानक विचारों से सहमत होगा: (पंक्तियां, कॉलम)।

यदि आप सिर्फ एक सूची np.array पास करते हैं, तो numpy को नहीं लगता कि उसके हाथों पर एक मैट्रिक्स है, और आकार को एक अलग तरीके से रिपोर्ट करता है।

सवाल यह है: क्या numpy लगता है कि यह एक मैट्रिक्स है, या ऐसा लगता है कि उसके हाथों में कुछ और है।

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