2013-03-14 3 views
5

x2_Kaxs सूचियों का एक Nx3 numpy सरणी है, और उन सूचियों में तत्वों को सूची में अन्य सरणी में सूचीबद्ध किया गया है। मैं उन अनुक्रमित तत्वों की सूचियों की एक Nx3 numpy सरणी के साथ समाप्त करना चाहता हूं।सूची को सूची रखने के लिए फोर्स numpy

x2_Kcids = array([ ax2_cid[axs] for axs in x2_Kaxs.flat ], dtype=object) 

यह numpy arrays के एक (एन * 3) x1 सरणी आउटपुट करता है। महान। जो मैं चाहता हूं उसके लिए लगभग काम करता है। मुझे बस इतना करना है कि इसे दोबारा बदल दें।

x2_Kcids.shape = x2_Kaxs.shape 

और यह काम करता है। x2_Kcids numpy arrays का एक Nx3 सरणी बन जाता है। उत्तम।

x2_Kaxs में सभी सूचियों को छोड़कर उनमें केवल एक तत्व है। फिर यह को पूर्णांक के एनएक्स 3 सरणी में फ़्लैट करता है, और मेरा कोड बाद में पाइपलाइन में एक सूची की अपेक्षा करता है।

एक समाधान जो मैं आया था वह एक डमी तत्व को जोड़ना था और फिर इसे बंद करना था, लेकिन यह बहुत बदसूरत है। क्या कुछ अच्छा है?

उत्तर

2

आपकी समस्या वास्तव में आकार 1 की सूची के बारे में नहीं है, यह सूची एक ही आकार के बारे में सब है। मैं इस डमी नमूने बनाया है: हम इन तीन पर अपने कोड चलाते हैं

ax2_cid = np.random.rand(10) 
shape = (10, 3) 

x2_Kaxs = np.empty((10, 3), dtype=object).reshape(-1) 
for j in xrange(x2_Kaxs.size): 
    x2_Kaxs[j] = [random.randint(0, 9) for k in xrange(random.randint(1, 5))] 
x2_Kaxs.shape = shape 

x2_Kaxs_1 = np.empty((10, 3), dtype=object).reshape(-1) 
for j in xrange(x2_Kaxs.size): 
    x2_Kaxs_1[j] = [random.randint(0, 9)] 
x2_Kaxs_1.shape = shape 

x2_Kaxs_2 = np.empty((10, 3), dtype=object).reshape(-1) 
for j in xrange(x2_Kaxs_2.size): 
    x2_Kaxs_2[j] = [random.randint(0, 9) for k in xrange(2)] 
x2_Kaxs_2.shape = shape 

, वापसी निम्नलिखित आकार है:

>>> np.array([ax2_cid[axs] for axs in x2_Kaxs.flat], dtype=object).shape 
(30,) 
>>> np.array([ax2_cid[axs] for axs in x2_Kaxs_1.flat], dtype=object).shape 
(30, 1) 
>>> np.array([ax2_cid[axs] for axs in x2_Kaxs_2.flat], dtype=object).shape 
(30, 2) 

और लंबाई 2 की सभी सूचियों के साथ मामला भी नहीं होगा आपको (n, 3) पर दोबारा बदलने दें। समस्या यह है कि, dtype=object के साथ भी, numpy को जितना संभव हो सके उतना इनपुट करने की कोशिश करता है, जो अलग-अलग तत्वों के नीचे है, यदि सभी सूचियां समान लंबाई के हैं। मुझे लगता है कि आपका सर्वश्रेष्ठ दांव अपने x2_Kcids सरणी preallocate के लिए है:

x2_Kcids = np.empty_like(x2_Kaxs).reshape(-1) 
shape = x2_Kaxs.shape 
x2_Kcids[:] = [ax2_cid[axs] for axs in x2_Kaxs.flat] 
x2_Kcids.shape = shape 

संपादित के बाद से unubtu का जवाब नहीं दिखाई देगा, मैं उसे से चोरी करने जा रहा हूँ। कोड ऊपर और अधिक अच्छी तरह से और दृढ़तापूर्वक लिखा जा सकता है के रूप में:

x2_Kcids = np.empty_like(x2_Kaxs) 
x2_Kcids.ravel()[:] = [ax2_cid[axs] for axs in x2_Kaxs.flat] 

एक आइटम की सूची के ऊपर के उदाहरण के साथ

:

>>> x2_Kcids_1 = np.empty_like(x2_Kaxs_1).reshape(-1) 
>>> x2_Kcids_1[:] = [ax2_cid[axs] for axs in x2_Kaxs_1.flat] 
>>> x2_Kcids_1.shape = shape 
>>> x2_Kcids_1 
array([[[ 0.37685372], [ 0.95328117], [ 0.63840868]], 
     [[ 0.43009678], [ 0.02069558], [ 0.32455781]], 
     [[ 0.32455781], [ 0.37685372], [ 0.09777559]], 
     [[ 0.09777559], [ 0.37685372], [ 0.32455781]], 
     [[ 0.02069558], [ 0.02069558], [ 0.43009678]], 
     [[ 0.32455781], [ 0.63840868], [ 0.37685372]], 
     [[ 0.63840868], [ 0.43009678], [ 0.25532799]], 
     [[ 0.02069558], [ 0.32455781], [ 0.09777559]], 
     [[ 0.43009678], [ 0.37685372], [ 0.63840868]], 
     [[ 0.02069558], [ 0.17876822], [ 0.17876822]]], dtype=object) 
>>> x2_Kcids_1[0, 0] 
array([ 0.37685372]) 
+0

@unubtu चूंकि आप अपने उत्तर हटा दिया गया है, मैं बेशर्म की नकल की है मेरे जवाब में एक संपादन में आपके flattened-array-on-the-left-of-असाइनमेंट। '.ravel() 'के साथ जाना था, हालांकि' .flat' अजीब परिणाम दे रहा था। – Jaime

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