2010-12-30 18 views
15

मैं numpy.genfromtxt का उपयोग कर एक फ़ाइल में पढ़ रहा हूं जो दोनों स्ट्रिंग्स और न्यूमेरिक मानों के कॉलम लाता है। एक चीज जो मुझे करने की ज़रूरत है वह इनपुट की लंबाई का पता लगाती है। यह सब ठीक है बशर्ते प्रत्येक सरणी में एक से अधिक मान पढ़े जाएं।केवल एक तत्व के साथ एक numpy सरणी की लंबाई का पता लगाने के लिए कैसे?

लेकिन ... यदि परिणामस्वरूप सरणी में केवल एक तत्व है, तो तर्क विफल हो जाता है। मैं एक उदाहरण यहां पुन: कर सकते हैं:

import numpy as np 
a = np.array(2.3) 

लेन (क) यह बताने वाला त्रुटि देता है:

TypeError: len() of unsized object 

हालांकि, अगर एक 2 या अधिक तत्वों, लेन() के रूप में एक उम्मीद होती है व्यवहार करता है।

import numpy as np 
a = np.array([2.3,3.6]) 

लेन (क) यहाँ रिटर्न 2

मेरी चिंता का विषय है, अगर मैं कुछ अजीब अपवाद हैंडलिंग का उपयोग, मैं एक खाली और एक होने लंबाई होने के बीच भेद नहीं कर सकते = 1.

संपादित करें: @noskio ने एक = np.array ([2.3]) सेट करने का सुझाव दिया। समस्या यह है कि, numpy.genfromtxt का उपयोग करके वास्तविक उत्पत्ति है। कोड इस तरह दिखता है:,

import numpy as np 
indata = np.genfromtxt(some_filename, names=True,dtype=None) 
a = indata['one_col_headername'] 

नतीजतन अगर indata फ़ाइल में केवल एक पंक्ति, एक 0-डी सरणी है।

+1

'सरणी ([2])' एक तत्व और 1 आयाम के साथ एक सरणी है । 'सरणी (2)' शून्य रैंक या शून्य आयाम वाला सरणी है। – endolith

उत्तर

32

आप एक लाइनर की जरूरत है:

In [1]: import numpy as np 

In [2]: a = np.array(2.3) 

In [3]: len(np.atleast_1d(a)) 
Out[3]: 1 

This page बताता है कि क्यों यह numpy में 0 आयामी सरणियों लागू करने का फैसला किया गया था।

+1

धन्यवाद @pberkes! इससे समस्याएं हल होती हैं और समस्या हल होती है – mishaF

+0

लिंक टूटा हुआ है :( – wim

+2

@ विम ऐसा लगता है कि लिंक हटा दिया गया है, और मुझे इसके लिए कोई प्रतिस्थापन नहीं मिल रहा है। – pberkes

0
a = np.array([2.3]) 
print len(a) 
+0

यह आपके द्वारा दिखाए जाने वाले स्थिर के लिए काम करता है, लेकिन एक सरणी इनपुट – ecoe

6
import numpy as np 

tests=[np.array(2.3),np.array([]),np.array([2.3]),np.array([2.3,3.6])] 

print('{a:30}{s:<10}{l:<10}{sl:<10}'.format(a='repr',s='shape',sl='len(shape)',l='length')) 
for a in tests: 
    s=a.shape 
    l=len(a) if a.shape else 0 
    sl=len(s) 
    print('{a!r:30}{s:<10}{l:<10}{sl:<10}'.format(a=a,l=l,s=s,sl=sl)) 

पैदावार

repr       shape  length len(shape) 
array(2.2999999999999998) ()  0   0   
array([], dtype=float64)  (0,)  0   1   
array([ 2.3])     (1,)  1   1   
array([ 2.3, 3.6])   (2,)  2   1   

आप एक "खाली" सरणी (जैसे np.array([])) और एक numpy अदिश (जैसे np.array(2.3)) आकार की लंबाई को देखकर के बीच भेद कर सकते हैं। (1 आप उम्मीद कर रहे हैं इस सवाल का जवाब यह सोचते है)

+0

धन्यवाद @unubtu के लिए नहीं। यह अच्छा है, लेकिन मैं 1 की लंबाई और एक खाली के बीच अंतर कैसे कर सकता हूं? – mishaF

+0

समझ गया! यह टन मदद करता है। – mishaF

3

ऐसा लगता है कि size एनंडर की संपत्ति इस मामले में काम करेगी यदि आपको पता है कि सरणी एक-आयामी है। मेरी राय में, a.sizelen(np.atleast_1d(a)) से बहुत अधिक पठनीय है। हालांकि, ध्यान दें कि size संपत्ति अगर यह एक से अधिक आयाम है सरणी में कुल तत्वों की संख्या वापस आ जाएगी:

In [1]: import numpy as np 

In [2]: np.array(2.3).size 
Out[2]: 1 

In [3]: np.array([1, 2]).size 
Out[3]: 2 

In [4]: np.array([[1,2], [3,4]]).size 
Out[4]: 4 
संबंधित मुद्दे