【问题标题】:How to create list of matrices from three lists in python 2.7?如何从 python 2.7 中的三个列表创建矩阵列表?
【发布时间】:2016-06-23 21:21:37
【问题描述】:

我需要在 python 2.7 中读取一个 txt 文件并从读数中创建四倍体列表。 txt 文件中的元素是 4 行的块。因此,每四行都是一个新元素。这是文件的示例元素:

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

因此,从这个示例中,新列表的元素将是 l=[('0','3', 53, matrix[[-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 中创建矩阵列表 m,其元素将成为矩阵的构建块。r1 的元素是 m 中矩阵的第一行,遵循相同的索引 r2是 m 中矩阵在同一索引之后的第二行,r3 是 m 中矩阵在同一索引之后的第三行。列表 m 应如下所示: m=[矩阵[[r1[0]][r2[0]][r3[0]]],矩阵[[r1[1]][r2[1]][r3[1]]]...] 如何从上述代码中的 r1,r2,r3 创建列表 m?

感谢您的帮助。

【问题讨论】:

  • 您可以将您的文件发布到 github 或 google 文档上吗?

标签: python list matrix


【解决方案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]])

【讨论】:

    【解决方案2】:

    您的代码看起来很复杂。你为什么不说一些类似的东西:

    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 
    

    【讨论】:

      【解决方案3】:

      我想这就是你要找的。​​p>

      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
      

      【讨论】:

        【解决方案4】:

        在 @MaxU 的基础上,如果列和行被标记,我通常使用 pandas DataFrames

        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
        

        顺便说一句,索引数组更快,所以如果你想用这种方式索引它……存储一个变量DF.as_matrix(),然后像A[i,j]一样索引它。如果您想实际索引DataFrame,那么您可以使用.iloc[i,j]

        【讨论】:

          猜你喜欢
          • 2016-05-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-08
          • 2016-07-29
          • 2020-02-05
          • 2016-07-29
          • 1970-01-01
          相关资源
          最近更新 更多