2013-02-16 55 views
14

मैं कॉलम के अनुसार n आकार (x,) के वैक्टर कैसे ढेर कर सकता हूं जहां x कोई संख्या हो सकती है?मैं न्यूमपी में विभिन्न लंबाई के वैक्टर कैसे ढेर करूं?

उदाहरण के लिए,

from numpy import * 
a = ones((3,)) 
b = ones((2,)) 

c = vstack((a,b)) # <-- gives an error 
c = vstack((a[:,newaxis],b[:,newaxis])) #<-- also gives an error 

hstack ठीक काम करता है लेकिन गलत आयाम में संयोजित करता।

उत्तर

21

संक्षिप्त उत्तर: आप नहीं कर सकते। NumPy जादुई सरणी का समर्थन नहीं करता है।

लांग जवाब:

>>> a = ones((3,)) 
>>> b = ones((2,)) 
>>> c = array([a, b]) 
>>> c 
array([[ 1. 1. 1.], [ 1. 1.]], dtype=object) 

एक सरणी कि या व्यवहार नहीं हो सकता कि आप उम्मीद कर सकते हैं के रूप में देता है। जैसे यह sum या reshape जैसी बुनियादी विधियों का समर्थन नहीं करता है, और आपको इसका इलाज करना चाहिए क्योंकि आप सामान्य पायथन सूची [a, b] (वेक्टरकृत मुहावरों का उपयोग करने के बजाय संचालन करने के लिए इसे फिर से चालू करते हैं) का इलाज करना चाहिए।

कई संभावित कामकाज मौजूद हैं; a और b को सामान्य लंबाई में masked arrays या NaN का उपयोग करके सबसे आसान है कि कुछ सूचकांक कुछ पंक्तियों में अमान्य हैं। जैसे यहाँ एक नकाबपोश सरणी के रूप में b है:

इस प्रकार
>>> ma.array(np.resize(b, a.shape[0]), mask=[False, False, True]) 
masked_array(data = [1.0 1.0 --], 
             mask = [False False  True], 
       fill_value = 1e+20) 

यह a साथ खड़ी जा सकता है:

>>> ma.vstack([a, ma.array(np.resize(b, a.shape[0]), mask=[False, False, True])]) 
masked_array(data = 
[[1.0 1.0 1.0] 
[1.0 1.0 --]], 
      mask = 
[[False False False] 
[False False True]], 
     fill_value = 1e+20) 

(कुछ प्रयोजनों के लिए, scipy.sparse भी दिलचस्प हो सकता है।)

+0

larsmans 'समाधान के लिए जोड़ने के लिए, अपने "दांतेदार" सरणियों का सबसे बड़ा लगता है (इस मामले np.nan में) एक शून्य मान के साथ मैट्रिक्स में खाली स्थान भरने की जरूरत है, तो आप इस्तेमाल कर सकते हैं ' max_entries = अधिकतम ([l, (x) x में [ए, बी]]) ', और स्वचालित रूप से मास्क उत्पन्न करने के लिए,' np.concatenate ([np.zeros (len (b), dtype = bool), np का उपयोग करें .ones (max_entries-len (बी), dtype = बूल)]) '। –

+0

निश्चित रूप से एक रास्ता होना चाहिए! यदि numpy में एक 1 आयामी सरणी ऑब्जेक्ट पॉइंटर्स को अन्य बहुआयामी सरणी में संग्रहीत कर रही है, तो बहुआयामी सरणी क्यों समान होनी चाहिए? पक्का नहीं? मदद की सराहना की। – CodeCabbie

3

सामान्य में, वहाँ अलग-अलग लंबाई के सरणी को एक साथ रखने में अस्पष्टता है क्योंकि डेटा का संरेखण महत्वपूर्ण हो सकता है। Pandas के साथ निपटने के लिए विभिन्न उन्नत समाधान हैं, उदा। डेटा फ्रेम में श्रृंखला विलय करने के लिए।

यदि आप केवल पहले तत्व से शुरू होने वाले स्तंभों को पॉप्युलेट करना चाहते हैं, तो मैं आमतौर पर जो मैट्रिक्स बनाता हूं और स्तंभों को पॉप्युलेट करता हूं। बेशक आप

a = ones((3,)) 
b = ones((2,)) 
arraylist=[a,b] 

outarr=np.ones((np.max([len(ps) for ps in arraylist]),len(arraylist)))*np.nan #define empty array 
for i,c in enumerate(arraylist): #populate columns 
    outarr[:len(c),i]=c 

In [108]: outarr 
Out[108]: 
array([[ 1., 1.], 
     [ 1., 1.], 
     [ 1., nan]]) 

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

  • कोई संबंधित समस्या नहीं^_^