将标头添加到np.matrix

时间:2016-01-16 11:24:48

标签: python arrays numpy ascii

我正在尝试将numpy矩阵导出为ASCII格式,但我想首先添加一个标题。

我的代码概念是:

  1. 将ASCII文件导入np.ndarray,比如矩阵A
  2. 取A的标题(前6行)。标题包含浮点值和字符
  3. 获取不是标题的A行(从第6行到最后一行),给出数组B
  4. 在B
  5. 上应用一些功能
  6. 以此格式保存为ASCII:标题(A)+ B
  7. 我尝试了以下内容:

    尝试1:

    import numpy as np
    A = np.genfromtxt('......Input\chm_plot_1.txt', dtype=None, delimiter='\t')
    header = A[0:6]
    B = A[6:]
    mat_out = np.concatenate([A,B])
    np.savetxt('........out.txt', mat_out, delimiter='\t')
    

    ,但是给出错误:

      

    TypeError:数组dtype(' | S3973')与格式不匹配   说明符('%。18e')

    尝试2:

    import numpy as np
    A = np.genfromtxt('......Input\chm_plot_1.txt', dtype=None, delimiter='\t')
    header = A[0:6]
    headers = np.vstack(header)
    head_list = headers.tolist()
    head_str = ''.join(str(v) for v in head_list)
    B = A[6:]
    np.savetxt('\out.txt', B, header = head_str,  delimiter='\t')
    

    ,它给出了同样的错误:

      

    TypeError:数组dtype(' | S3973')与格式不匹配   说明符('%。18e')

    尝试3:

    import numpy as np
    import linecache
    
    A = np.genfromtxt('.............\Input\chm_plot_1.txt', dtype=None, delimiter='\t')
    line1 = linecache.getline('.............Input\chm_plot_1.txt', 1)
    line2 = linecache.getline('.............Input\chm_plot_1.txt', 2)
    line3 = linecache.getline('.............Input\chm_plot_1.txt', 3)
    line4 = linecache.getline('.............Input\chm_plot_1.txt', 4)
    line5 = linecache.getline('.............Input\chm_plot_1.txt', 5)
    line6 = linecache.getline('.............Input\chm_plot_1.txt', 6)
    header2 = line1
    header2 += line2
    header2 += line3
    header2 += line4
    header2 += line5
    header2 += line6
    
    B = A[6:]
    np.savetxt('........\out.txt', B , header = header2,  delimiter='\t')
    

    ,这给了我同样的错误:

      

    TypeError:数组dtype(' | S3973')与格式不匹配   说明符('%。18e')

    A数组的第一行如下:

    从第6行开始打印[0:8]#,行有100多个值,标题是前6行

    ['ncols         371' 'nrows         435' 'xllcorner     520298.0053'
     'yllcorner     436731.3065' 'cellsize      1' 'NODATA_value  -9999'
    '16.52002 15.90161 15.96692 20.32922 20.59827 18.28137 18.83533 17.66 .......
    '13.16687 17.09497 7.309204 20.83655 19.05078 17.68591 17.88464 ...... ']
    

    任何帮助将不胜感激!谢谢:))

    编辑:我从输入数据(chm_plot_1.txt)上传了一个样本。链接如下:http://we.tl/mjgBe4QIRM

    Edit2:在回答之后,问题是它插入了"#"标题行开头的字符,如下图所示。此外,还有一条补充线,即第7条,应该被删除。

    enter image description here

    编辑3:我认为错误

      

    ValueError:float()

    的文字无效

    是由于样本与完整文件中的数据格式不同。虽然两者都是.txt,但它们的排列方式不同,如下图所示。

    chm_plot_1 chm_plot_1_sample

1 个答案:

答案 0 :(得分:1)

问题是您的标题格式与数据格式不同。

解决这个问题的方法:将标题视为普通文件文本,将数据视为数字。

with open('chm_plot_1_sample.txt') as f : 
      header="".join([f.readline() for i in range(6)])[:-1]
a=np.loadtxt('chm_plot_1_sample.txt',delimiter='\t',skiprows=6)
a=a/2  # some treatement
np.savetxt('out.txt',a,delimiter='\t',header=header,comments='')