सूचियों की सूची सुन्न सरणी में


184

मैं सूचियों की एक साधारण सूची को एक सुव्यवस्थित सरणी में कैसे बदलूं? पंक्तियाँ व्यक्तिगत सबलिस्ट हैं और प्रत्येक पंक्ति में सबलिस्ट में तत्व शामिल हैं।

जवाबों:


199

यदि आपकी सूचियों की सूची में तत्वों की संख्या अलग-अलग है, तो इग्नासियो वाज़केज़-अब्राम्स का उत्तर काम नहीं करेगा। इसके बजाय कम से कम 3 विकल्प हैं:

1) सारणियों का एक सरणी बनाएं:

x=[[1,2],[1,2,3],[1]]
y=numpy.array([numpy.array(xi) for xi in x])
type(y)
>>><type 'numpy.ndarray'>
type(y[0])
>>><type 'numpy.ndarray'>

2) सूचियों की एक सरणी बनाएं:

x=[[1,2],[1,2,3],[1]]
y=numpy.array(x)
type(y)
>>><type 'numpy.ndarray'>
type(y[0])
>>><type 'list'>

3) सबसे पहले सूचियों को लंबाई में बराबर करें:

x=[[1,2],[1,2,3],[1]]
length = max(map(len, x))
y=numpy.array([xi+[None]*(length-len(xi)) for xi in x])
y
>>>array([[1, 2, None],
>>>       [1, 2, 3],
>>>       [1, None, None]], dtype=object)

15
धन्यवाद, इसके लिए यहां आए। थोड़ी देर के लिए सुन्न का उपयोग कर रहे हैं, और इस व्यवहार को गैर-तुच्छ पाया। इस अधिक सामान्य मामले को समझाने के लिए समय निकालने के लिए धन्यवाद।
एडम ह्यूजेस

dtype=floatकाम करता है, यह करने के Noneलिए बदल जाएगा np.nan, जो उपयोगी हो सकता है।

108
>>> numpy.array([[1, 2], [3, 4]]) 
array([[1, 2], [3, 4]])

13
यह स्वचालित रूप से एक 2 डी सरणी में सूची की सूची में बदल जाता है क्योंकि सभी शामिल सूचियों की लंबाई समान होती है। क्या आप जानते हैं कि ऐसा कैसे नहीं किया जाता है: सूची की एक सरणी बनाएं भले ही सभी सूचियों की लंबाई समान हो? या 1 डी सरणी के 1 डी सरणी में 2 डी सरणी को बदलना संभव है (कुशलतापूर्वक मेरा मतलब है, कोई पुनरावृत्ति विधि या अजगर मानचित्र सामान)
जुह_

7
यदि वह आपके लिए काम नहीं करता है क्योंकि आपके सब्लिस्ट भी आकार के नहीं हैं, तो निम्न उत्तर देखें
निकाना रेक्लाविक्स

@NikanaReklawyks मैं जवाब देखने के बाद उलझन में था लेकिन आपकी टिप्पणी उपयोगी थी। मुझे पता चला कि मेरी सूचियों की सूची दांतेदार हो गई थी, जब यह होना नहीं था।
निखिल गिर्राज

39

चूंकि यह Google की शीर्ष सूची को नैम्पी सरणी में बदलने के लिए शीर्ष पर है, इसलिए प्रश्न 4 साल पुराना होने के बावजूद मैं निम्नलिखित की पेशकश करूंगा:

>>> x = [[1, 2], [1, 2, 3], [1]]
>>> y = numpy.hstack(x)
>>> print(y)
[1 2 1 2 3 1]

जब मैंने पहली बार इस तरह से करने के बारे में सोचा, तो मैं खुद से काफी खुश था क्योंकि यह सरल है। हालाँकि, यह सूचियों की एक बड़ी सूची के साथ समय के बाद, यह वास्तव में ऐसा करने के लिए तेज़ है:

>>> y = numpy.concatenate([numpy.array(i) for i in x])
>>> print(y)
[1 2 1 2 3 1]

ध्यान दें कि @ बस्तियान का उत्तर # 1 एक निरंतर सूची नहीं बनाता है, इसलिए मैंने इसे जोड़ा concatenate

वैसे भी ... मैं hstackइसे Numpy के सुरुचिपूर्ण उपयोग के लिए दृष्टिकोण पसंद करता हूं ।


12
जबकि कुछ लोग इस की तलाश में हो सकते हैं, मुझे पूरा यकीन है कि ओपी को एक बहुआयामी नैपर चाहिए था।
नाथन

1
मैं यह देख रहा था :))
पल्ली


6

फिर, एन स्तरों के साथ नेस्टेड सूचियों को एन-आयामी सरणी में परिवर्तित करने की समस्या के बारे में खोज करने के बाद मुझे कुछ भी नहीं मिला, इसलिए यहां मेरा तरीका है:

import numpy as np

new_array=np.array([[[coord for coord in xk] for xk in xj] for xj in xi], ndmin=3) #this case for N=3

ध्यान दें कि यदि आपके पास पहले से ही नेस्टेड-लिस्ट संरचना है, तो आपको [...[...[...]]]भाग की आवश्यकता नहीं है । आपको बस कॉल करने की जरूरत है np.array, साथ ndmin=number-of-list-layers। (हालांकि मेरे मामले में मुझे ndmin=number-of-list-layers-minus-1किसी कारण की आवश्यकता थी , अन्यथा एक अतिरिक्त परत बनाई गई - जांच करने की आवश्यकता)
वेनेरिक्स

आह ठीक है, मेरे मामले में समस्या यह है कि सबसे गहरी "सूची परत" के लिए, सूचियों में सभी की लंबाई समान नहीं थी, जो np.arrayउन गहरी-सूचियों को केवल "रैप" करने के बजाय उन्हें सुप्त सरणियों में बदल देती है।
वेनेरिक्स

-2

मेरे पास समान लंबाई की सूचियों की एक सूची थी। तब भी Ignacio Vazquez-Abramsमेरे लिए जवाब नहीं आया। मुझे 1-डी सुपीरियर एरे मिला है जिसके तत्व सूचियां हैं। यदि आप एक ही समस्या का सामना कर रहे हैं, तो आप नीचे दी गई विधि का उपयोग कर सकते हैं

उपयोग numpy.vstack

import numpy as np

np_array = np.empty((0,4), dtype='float')
for i in range(10)
     row_data = ...   # get row_data as list
     np_array = np.vstack((np_array, np.array(row_data)))

1
क्यों पृथ्वी पर आप स्टैकिंग रखेंगे यदि आप जानते हैं कि आपके पास 10 सूचियां हैं, तो np.empty ((10, 4)) क्यों नहीं और फिर इसे भरने के लिए?
मेहंदी

-4

बस पांडा का उपयोग करें

list(pd.DataFrame(listofstuff).melt().values)

यह केवल सूचियों की सूची के लिए काम करता है

यदि आपके पास सूचियों की एक सूची है, तो आप कुछ लाइनों के साथ प्रयास करना चाह सकते हैं

lists(pd.DataFrame(listofstuff).melt().apply(pd.Series).melt().values)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.