2016-06-23 3 views
1

Мне нужно прочитать txt-файл в python 2.7 и создать список четверки из показаний. Элементы в файле txt представляют собой блоки из 4 строк. Таким образом, каждая четвертая строка является новым элементом. Ниже приведен пример элемента файла:Как создать список матриц из трех списков в python 2.7?

0 3 53 
-0.999909 -0.0135226 851.576 
0.0135226 -0.999909 901.481 
0 0 1 
... 

Таким образом, из этого образца элемент нового списка будет л = [(«0», «3», 53, матрица [[- 0,999909 -0,0135226 851,576 ], [0.0135226 -0.999909 901.481], [0 0 1]])] Все эти кортежи в l хорошо являются считанными элементами из txt-файла в этой форме (строка, строка, целое число, матрица). Я разработал код для составления списков первых трех элементов в кортеже, но у меня проблемы с составлением списка матриц для четвертого элемента кортежа. Вот то, что я до сих пор:

import numpy as np             
import re                
import operator              

file=open('matching.txt','r')           
f=file.readlines()             
v1, v2, w, r1, r2, r3 = [],[],[], [], [], []       
for x, line in enumerate(f):           
    if x % 4 is 0:             
     v1.append(line[:1])           
     v2.append(line[2:3])           
     str = re.search(' ([0-9]*)\r\n', line)      
     if str:              
      found = int(str.group(1))        
     w.append(found)            
    elif x % 4 is 1:             
     r1.append(line)            
    elif x % 4 is 2:             
     r2.append(line)            
    else:                
     r3.append(line)   

Мне нужно создать список м матриц из трех вышеупомянутых списков r1, r2, r3, элементы которого будут строительные блоки для matrices.Elements из r1 является первым строка матриц в m, следующих за одним и тем же индексом, r2 - секонная строка матриц в m, следующих за одним и тем же индексом, r3 - третья строка матриц в m, следующих за одним и тем же индексом. Список m должен выглядеть примерно так: m = [matrix [[r1 [0]] [r2 [0]] [r3 [0]]], матрица [[r1 [1]] [r2 [1]] [ r3 [1]]] ...] Как создать список m из r1, r2, r3 из вышеуказанного кода?

Благодарим вас за помощь.

+0

Можете ли вы разместить свой файл в github или google docs? –

ответ

1

попробовать это:

файл a.data:

0 3 53 
-0.999909 -0.0135226 851.576 
0.0135226 -0.999909 901.481 
0 0 1 
0 4 54 
-0.999909 -0.0135226 851.576 
0.0135226 -0.999909 901.481 
1 1 2 

Код:

In [47]: fn = 'a.data' 
In [49]: np.loadtxt(fn) 
Out[49]: 
array([[ 0.00000000e+00, 3.00000000e+00, 5.30000000e+01], 
     [ -9.99909000e-01, -1.35226000e-02, 8.51576000e+02], 
     [ 1.35226000e-02, -9.99909000e-01, 9.01481000e+02], 
     [ 0.00000000e+00, 0.00000000e+00, 1.00000000e+00], 
     [ 0.00000000e+00, 4.00000000e+00, 5.40000000e+01], 
     [ -9.99909000e-01, -1.35226000e-02, 8.51576000e+02], 
     [ 1.35226000e-02, -9.99909000e-01, 9.01481000e+02], 
     [ 1.00000000e+00, 1.00000000e+00, 2.00000000e+00]]) 
1

Ваш код кажется очень сложным. Почему бы вам не какое-то вроде:

import numpy as np             
import re                
import operator              

# reading lines 
file=open('matching.txt','r') 
i = 0 
temp = [] # temp is a buffer used to remember the previous lines 
for line in file: # for each line 
    res = list(map(int, line.split())) # res = [v1, v2, v3] 
    temp.append(res)     # adding res, so temp = [..... [v1, v2, v3]] 

    if i % 4 == 3: 
     # each fourth line (the algorithm will do 0 1 2 3 4 5 6 7 8 ...) 
     # and i%4 = 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 ... 
     # now, temp= [[v1, v2, v3], [v4, v5, v6], ...] 
     print(np.matrix(temp)) # convert array of array to matrix 
     temp= [] 


    i += 1 
1

Строительства прочь @MaxU, я обычно использую pandasDataFrames если столбцы и строки помечены

import pandas as pd 
import numpy as np 

DF = pd.read_table("a.data", sep=" ") 

DF 
      0   1  2 
0 0.000000 3.000000 53.000 
1 -0.999909 -0.013523 851.576 
2 0.013523 -0.999909 901.481 
3 0.000000 0.000000 1.000 
4 0.000000 4.000000 54.000 
5 -0.999909 -0.013523 851.576 
6 0.013523 -0.999909 901.481 
7 1.000000 1.000000 2.000 

, то вы можете установить метки на

DF.columns = #list of column labels 
DF.index = #list of index labels 

btw, индексирование массива происходит быстрее, поэтому если вы хотите индексировать его, используя этот способ ... сохраните переменную DF.as_matrix(), а затем проиндексируйте ее как A[i,j]. Если вы хотите на самом деле индексировать DataFrame, то вы делаете .iloc[i,j]

1

Я полагаю, это то, что вы ищете.

import numpy as np             
import re                
import operator              

final_list = [] 
with open('data.txt','r') as f: 
    line_1 = [float(num) for num in f.readline().split()] 
    line_2 = [float(num) for num in f.readline().split()] 
    line_3 = [float(num) for num in f.readline().split()] 
    line_4 = [float(num) for num in f.readline().split()] 

    #creating matrix from the 3 lines 
    mat = np.matrix([line_2, line_3, line_4]) 

    line_1.append(mat) 
    final_list.append(tuple(line_1)) 

print final_list 
Смежные вопросы