从数据列表构造矩阵对象(由空行分隔)

时间:2016-12-12 08:13:19

标签: python python-3.x numpy

我有一个文件,其科学数据用科学记数法表示。格式如下,总是有6行数字串在一起,

  4.748257444721457E-004    
 -4.058788876602824E-006    
 -1.494658656964534E-004    
  4.686186383664201E-006    
  3.840708360798801E-006    

-3.237680480600605E-005
-3.237680480600605E-005
5.290165586028430E-005
-1.312378015891650E-005
-9.693957759497108E-006
3.184131106435972E-005

我正在尝试从上面构建一个矩阵(在python中)到表单,如下所示;

  4.748257444721457E-004     -3.237680480600605E-005
 -4.058788876602824E-006      5.290165586028430E-005
 -1.494658656964534E-004     -1.312378015891650E-005
  4.686186383664201E-006     -9.693957759497108E-006
  3.840708360798801E-006      3.184131106435972E-005

我想知道在python中是否可以使用矩阵这样的构造(然后可以用于进一步的数学分析)?

我试过这种方法。

将数字转换为十进制,然后使用bash脚本创建一个矩阵,然后在python中加载为txt。

但是,我不想摆脱浮点数(导致精度损失),因此我想到一种循环方法来生成这个矩阵。实际数据集具有54x54值。

1 个答案:

答案 0 :(得分:1)

它可能对你有帮助。

import numpy as np

matrix = []
row = []
with open("input.txt") as f:
    for line in f:
        line = line.rstrip('\n')
        if not line:
            if len(row) != 0:
                matrix.append(row)
            row = []
            continue
        row.append(float(line))

if len(row) != 0:
    matrix.append(row)

matrix = np.asarray(matrix).T
print(matrix)

打印:

[[  4.74825744e-04  -3.23768048e-05]
 [ -4.05878888e-06  -3.23768048e-05]
 [ -1.49465866e-04   5.29016559e-05]
 [  4.68618638e-06  -1.31237802e-05]
 [  3.84070836e-06  -9.69395776e-06]
 [  3.84070836e-06   3.18413111e-05]]

您还可以通过遍历行和列来打印矩阵。

for row in range(matrix.shape[0]):
    for column in range(matrix.shape[1]):
        print(matrix[row][column], end=' ')
    print()

打印:

0.000474825744472 -3.2376804806e-05 
-4.0587888766e-06 -3.2376804806e-05 
-0.000149465865696 5.29016558603e-05 
4.68618638366e-06 -1.31237801589e-05 
3.8407083608e-06 -9.6939577595e-06 
3.8407083608e-06 3.18413110644e-05

您还可以科学的格式精确打印。

print('{:.4e}'.format(matrix[row][column]), end=' ')

输入文件 - input.txt包含:

4.748257444721457e-004
-4.058788876602824e-006
-1.494658656964534e-004
4.686186383664201e-006
3.840708360798801e-006
3.840708360798801e-006

-3.237680480600605e-005
-3.237680480600605e-005
5.290165586028430e-005
-1.312378015891650e-005
-9.693957759497108e-006
3.184131106435972e-005