2012-11-29 4 views
6

मैं बस आकार की एक numpy सरणी (एन, एम) बनाना चाहता हूं जिसमें केवल पूर्णांक से पहले कॉलम है, और बाकी डिफ़ॉल्ट फ्लोट द्वारा। परिणाम तो है कि, अगर शून्य प्रारंभ यह होना चाहिए: जब इस तरह के एक संरचित सरणी बनाने का प्रयास करकैसे (बस) एक पूर्णांक और फ्लोट मिश्रित numpy सरणी बनाने के लिए

array([[ 0, 0., 0., 0., 0.], 
     [ 0, 0., 0., 0., 0.], 
     [ 0, 0., 0., 0., 0.], 
     [ 0, 0., 0., 0., 0.], 
     [ 0, 0., 0., 0., 0.]]) 

सभी प्रयास मैं बना दिया है मुझे वापस जाने के कुछ टपल उप तत्वों।

+0

जिज्ञासा से, आपको इसकी आवश्यकता क्यों होगी? – Rambatino

+0

कल्पना करें कि आपको कुछ मिश्रित डेटा स्टोर करना है, जहां 1 फ़ील्ड पूर्णांक है (यानी एक विघटित स्थिति), और अन्य वास्तविक हैं। – gluuke

+0

लेकिन आप इस डेटा के साथ क्या कर रहे हैं? 1 कब है! = 1.0 समस्याग्रस्त? – Rambatino

उत्तर

13

आप dtype = object साथ एक सरणी इस्तेमाल कर सकते हैं:

>>> arr = np.ndarray((10,4),dtype = object) 
>>> arr[:,0] = int(10) 
>>> arr[:,1:] = float(10) 
>>> arr 
array([[10, 10.0, 10.0, 10.0], 
     [10, 10.0, 10.0, 10.0], 
     [10, 10.0, 10.0, 10.0], 
     [10, 10.0, 10.0, 10.0], 
     [10, 10.0, 10.0, 10.0], 
     [10, 10.0, 10.0, 10.0], 
     [10, 10.0, 10.0, 10.0], 
     [10, 10.0, 10.0, 10.0], 
     [10, 10.0, 10.0, 10.0], 
     [10, 10.0, 10.0, 10.0]], dtype=object) 

सूचना है कि आप सही व्यवहार जब गणित कर मिलता है।

>>> arr/3 
array([[3, 3.33333333333, 3.33333333333, 3.33333333333], 
     [3, 3.33333333333, 3.33333333333, 3.33333333333], 
     [3, 3.33333333333, 3.33333333333, 3.33333333333], 
     [3, 3.33333333333, 3.33333333333, 3.33333333333], 
     [3, 3.33333333333, 3.33333333333, 3.33333333333], 
     [3, 3.33333333333, 3.33333333333, 3.33333333333], 
     [3, 3.33333333333, 3.33333333333, 3.33333333333], 
     [3, 3.33333333333, 3.33333333333, 3.33333333333], 
     [3, 3.33333333333, 3.33333333333, 3.33333333333], 
     [3, 3.33333333333, 3.33333333333, 3.33333333333]], dtype=object) 

या आप एक numpy.recarray इस्तेमाल कर सकते हैं:

>>> import numpy as np 
>>> arr = np.recarray(10,dtype=[('x',int),('y',float,4)]) 
>>> arr[:] = 0 
>>> arr 
rec.array([(0, array([ 0., 0., 0., 0.])), (0, array([ 0., 0., 0., 0.])), 
      (0, array([ 0., 0., 0., 0.])), (0, array([ 0., 0., 0., 0.])), 
      (0, array([ 0., 0., 0., 0.])), (0, array([ 0., 0., 0., 0.])), 
      (0, array([ 0., 0., 0., 0.])), (0, array([ 0., 0., 0., 0.])), 
      (0, array([ 0., 0., 0., 0.])), (0, array([ 0., 0., 0., 0.]))], 
    dtype=[('x', '<i4'), ('y', '<f8', (4,))]) 
>>> arr['x'] 
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) 
>>> arr['y'] 
array([[ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.]]) 

आप सभी मूल्यों पर गणित करने की जरूरत है, तो आप अलग से प्रत्येक क्षेत्र पर कार्रवाई करने के लिए होगा, उदा

>>> arr['x'] += 2 
>>> arr['y'] += 2 
0

जो इंगित करता है सभी सदस्य एक ही प्रकार का होना जरूरी

NumPy के मुख्य उद्देश्य सजातीय बहुआयामी सरणी है numpy दस्तावेज में इस पढ़ें। यह तत्वों (आमतौर पर संख्याओं) की तालिका है, सभी प्रकार के समान, द्वारा अनुक्रमित सकारात्मक पूर्णांक का एक टुपल।

2

हालांकि मैं कारणों से आप पहली जगह में ऐसा करने के लिए इच्छुक नहीं किया जाना चाहिए के बहुत सारे के बारे में सोच सकते हैं, यह मुझे न्यायाधीश करने के लिए नहीं है, और मुझे नफरत है जब लोग मेरे अपने के मूल्य को कम करने का प्रयास करें quick'n'dirty हैक्स।

तर्क dtype=object का उपयोग करना है। चूंकि पाइथन में सब कुछ एक वस्तु है, इसलिए आप एक सरणी के अंदर एकरूपता को संरक्षित करते हुए संख्यात्मक प्रकारों को मिश्रित कर सकते हैं। मैं निम्नलिखित सुझाव देता हूं, लेकिन आप स्पष्ट रूप से अपनी आवश्यकताओं के अनुकूल हो सकते हैं:

import numpy 

rows = 5 
a = numpy.zeros((rows,5)).astype(object) 
a[:,0] = a[:,0].astype(int) 
print a 

[[0 0.0 0.0 0.0 0.0] 
[0 0.0 0.0 0.0 0.0] 
[0 0.0 0.0 0.0 0.0] 
[0 0.0 0.0 0.0 0.0] 
[0 0.0 0.0 0.0 0.0]] 
संबंधित मुद्दे