मेरे पास लगातार नियम खनन के लिए डेटा वाले डेटासेट हैं जहां प्रत्येक पंक्ति में अलग-अलग आइटम होते हैं जैसे

9 10 5
8 9 10 5 12 15
7 3 5

क्या कोई ऐसा तरीका है जिससे हम उपरोक्त सामग्री वाली फाइलों को एक ही बार में पढ़ सकें और इसे arrays की तरह numpy array में बदल सकें np.array(np.array([

array([array([ 9, 10,  5]), array([ 8,  9, 10,  5, 12, 15]),
       array([7, 3, 5])], dtype=object)

मैं numpy.loadtxt फ़ंक्शन में आया हूं, लेकिन यह अलग-अलग संख्या में कॉलम को पूरा नहीं करता है जिस तरह से मैं चाहता हूं। स्तंभों की विभिन्न संख्याओं के साथ, loadtxt को डेटा पढ़ने के लिए उपयोग किए जाने वाले स्तंभों का उल्लेख करना आवश्यक है। लेकिन, मैं प्रत्येक पंक्ति में सभी मानों को पढ़ना चाहता हूं।
इसे हासिल करने का एक तरीका फाइलों को मैन्युअल रूप से पढ़ना और प्रत्येक पंक्ति को numpy 'सरणी' में परिवर्तित करना हो सकता है, लेकिन मैं उस मार्ग को नहीं लेना चाहता क्योंकि वास्तविक डेटासेट यहां दिखाए गए छोटे उदाहरण से बहुत बड़ा होगा। . उदाहरण के लिए, मैं FIMI रिपॉजिटरी से डेटासेट का उपयोग करने की योजना बना रहा हूं। एक नमूना डेटा दुर्घटना डेटा है।
संपादित करें: मैं जो चाहता हूं उसे प्राप्त करने के लिए मैंने निम्नलिखित कोड का उपयोग किया:

data = []
# d = np.loadtxt('datasets/grocery.dat')
with open('datasets/accidents.dat', 'r') as f:
    for l in f.readlines():
        ar = np.genfromtxt(StringIO(l))
        data.append(ar)
print(data)
data = np.array(data)
print(data)

लेकिन, यही वह है जिससे मैं बचना चाहता हूं: पायथन कोड में लूपिंग क्योंकि इसे पढ़ने में चार मिनट से अधिक समय लगा nofollow noreferrer">डेटा और इसे numpy arrays में बदलें

1
Muhammad Adeel Zahid 16 अप्रैल 2020, 01:20

1 उत्तर

सबसे बढ़िया उत्तर
In [401]: txt="""9 10 5 
     ...: 8 9 10 5 12 15 
     ...: 7 3 5 
     ...: 9 10 5 
     ...: 8 9 10 5 12 15 
     ...: 7 3 5 
     ...: 9 10 5 
     ...: 8 9 10 5 12 15 
     ...: 7 3 5""".splitlines()                                                                        

(यह अनुमान लगाता है कि हमें readlines से क्या प्राप्त होगा)

सूचियों की सूची एकत्र करना सीधे आगे है, लेकिन स्ट्रिंग्स को संख्याओं में बदलने के लिए सूची की समझ की आवश्यकता होगी:

In [402]: alist = []                                                                                   
In [403]: for line in txt: 
     ...:     alist.append(line.split()) 
     ...:                                                                                              
In [404]: alist                                                                                        
Out[404]: 
[['9', '10', '5'],
 ['8', '9', '10', '5', '12', '15'],
 ['7', '3', '5'],
 ['9', '10', '5'],
 ['8', '9', '10', '5', '12', '15'],
 ['7', '3', '5'],
 ['9', '10', '5'],
 ['8', '9', '10', '5', '12', '15'],
 ['7', '3', '5']]
In [405]: np.array(alist)                                                                              
Out[405]: 
array([list(['9', '10', '5']), list(['8', '9', '10', '5', '12', '15']),
       list(['7', '3', '5']), list(['9', '10', '5']),
       list(['8', '9', '10', '5', '12', '15']), list(['7', '3', '5']),
       list(['9', '10', '5']), list(['8', '9', '10', '5', '12', '15']),
       list(['7', '3', '5'])], dtype=object)

प्रत्येक पंक्ति को एक पूर्णांक सरणी में परिवर्तित करना तेज़ हो सकता है (लेकिन यह केवल एक अनुमान है):

In [406]: alist = [] 
     ...: for line in txt: 
     ...:     alist.append(np.array(line.split(), dtype=int)) 
     ...:      
     ...:                                                                                              
In [407]: alist                                                                                        
Out[407]: 
[array([ 9, 10,  5]),
 array([ 8,  9, 10,  5, 12, 15]),
 array([7, 3, 5]),
 array([ 9, 10,  5]),
 array([ 8,  9, 10,  5, 12, 15]),
 array([7, 3, 5]),
 array([ 9, 10,  5]),
 array([ 8,  9, 10,  5, 12, 15]),
 array([7, 3, 5])]
In [408]: np.array(alist)                                                                              
Out[408]: 
array([array([ 9, 10,  5]), array([ 8,  9, 10,  5, 12, 15]),
       array([7, 3, 5]), array([ 9, 10,  5]),
       array([ 8,  9, 10,  5, 12, 15]), array([7, 3, 5]),
       array([ 9, 10,  5]), array([ 8,  9, 10,  5, 12, 15]),
       array([7, 3, 5])], dtype=object)

पाठ की अनियमित प्रकृति और परिणाम में सरणी की लंबाई के मिश्रण को देखते हुए, कोई विकल्प नहीं है। विविध आकार की सरणियाँ या सूचियाँ एक बहुत अच्छा संकेतक है कि तेजी से बहुआयामी सरणी संचालन संभव नहीं है।

हम सभी नंबरों को 1d सरणी के रूप में लोड कर सकते हैं:

In [413]: np.fromstring(' '.join(txt), sep=' ', dtype=int)                                             
Out[413]: 
array([ 9, 10,  5,  8,  9, 10,  5, 12, 15,  7,  3,  5,  9, 10,  5,  8,  9,
       10,  5, 12, 15,  7,  3,  5,  9, 10,  5,  8,  9, 10,  5, 12, 15,  7,
        3,  5])

लेकिन इसे लाइन एरेज़ में विभाजित करने के लिए अभी भी किसी प्रकार की लाइन काउंट की आवश्यकता होती है, जिसके बाद एरे स्प्लिट होता है। इसलिए मुझे संदेह है कि क्या इससे किसी भी समय की बचत होगी।

2
hpaulj 16 अप्रैल 2020, 03:49