【问题标题】:Python: read timesteps from csv to arrays: Post-processing model-data with numpy;Python:从 csv 读取时间步长到数组:使用 numpy 对模型数据进行后处理;
【发布时间】:2014-06-14 17:58:07
【问题描述】:

我仍在尝试使用 python,但这个问题超出了我的知识范围:

主题:流体动力后处理: 液压软件的csv输出到数组,拆分时间步长

这里是数据以及我的工作代码有多远:

输入文件(见下文):

第一行:结果节点数

第二行:标题

第三行:timestep @ time=

以下:此时间步长的所有结果(在此文件中:13541 个节点,变量) ....在下一个时间步再次相同。

# Number of Nodes: 13541
#X                  Y                   Z                   depth               wse             
# Output at t = 0
       5603.7598           4474.4902           37.470001                   0           37.470001
          5610.5           4461.6001           36.020001                   0           36.020001
         5617.25             4448.71           35.130001                   0           35.130001
       5623.9902           4435.8198               35.07                   0               35.07
       5630.7402           4422.9199               35.07                   0               35.07
       5761.5801             4402.79           35.369999                   0           35.369999
COMMENT:....................13541 timesteps...........
# Output at t = 120.04446
       5603.7598           4474.4902           37.470001           3.6977223           41.167724
          5610.5           4461.6001           36.020001           4.1377293            40.15773
         5617.25             4448.71           35.130001           3.9119012           39.041902
       5623.9902           4435.8198               35.07           3.7923947           38.862394
       5630.7402           4422.9199               35.07            3.998436           39.068436
       5761.5801             4402.79           35.369999           3.9750571           39.345056
COMMENT:....................13541 timesteps...........
# Output at t = 240.06036
       5603.7598           4474.4902           37.470001           11.131587           48.601588
          5610.5           4461.6001           36.020001           12.564266           48.584266
         5617.25             4448.71           35.130001           13.498463           48.628464
       5623.9902           4435.8198               35.07           13.443041           48.513041
       5630.7402           4422.9199               35.07           11.625824           46.695824
       5761.5801             4402.79           35.369999            19.49551           54.865508

问题: 我需要一个循环,它将 n 个时间步读入数组。

结果应该是:每个时间步长的数组:在本例中为 27 个时间步长,每个时间步长 13541 个元素。

timestep_1=[此时间步的所有元素:shape=13541,5]

timestep_2=[]

timestep_3[]

........

timestep_n=[]

到目前为止我的代码:

 import numpy as np
 import csv
 from numpy import *
 import itertools

 #read file to big array
 array=np.array([row for row in csv.reader(open("ascii-full.csv", "rb"), delimiter='\t')])      
 firstRow=array[0]
 secondRow=array[1]

 # find out how many nodes
 strfirstRow=' '.join(map(str,firstRow))
 first=strfirstRow.split()
 print first[4]
 nodes=first[4]
 nodes=float(nodes)

 #count timesteps
 temp=(len(array)-3)/nodes           
 timesteps=int(temp)+1

 #split array into timesteps:
 # X Y Z h(t1) h(t2) h(tn)

 ts1=array[3:nodes+3]#13541
 #print ts1

 ts2=array[nodes+4:nodes*2+4]
 #print ts2


 .......
 read ts3 to last timestep to arrays with loop....

也许有人可以帮助我,谢谢!!!

【问题讨论】:

    标签: python loops file-io numpy post-processing


    【解决方案1】:

    您可以使用np.genfromtxt() 获得一个 3-D 数组,例如:

    import numpy as np
    
    gen = (a for a in open('test.txt') if not a[0] in ['#', 'C'])
    a = np.genfromtxt(gen).reshape(-1, 6, 5)
    

    其中a[i] 将表示时间步长i 的输出。

    【讨论】:

      【解决方案2】:

      我对您的问题的看法是,不是将整个文件读入数组并处理数组,而是逐行读取,在读取数据时创建数组。

      我按照文件中的描述读取每个时间步长的行数和列数,然后为每个读取的时间步长创建一个新数组(将其添加到列表中),然后用读取的数据填充它。

      import numpy as np
      
      timesteps = []
      timestep_results = []
      
      f = open("ascii-full.csv", "rb")
      
      # First line is number of rows (not counting the initial #)
      rows = int(f.readline().strip()[1:].split()[-1])
      counter = 0
      
      # Second line is number of columns
      columns = len(f.readline().strip().split())
      
      # Next lines
      for line in f:
          if line.startswith("#"):
              # it's a header: add time to timestep list, begin new array
              timesteps.append( float(line.strip().split("=")[1]) )
              timestep_results.append( np.zeros((rows, columns)) )
              counter = 0
          else:
              # it's data: add to array in appropiate row
              timestep_results[-1][counter] = map(float, line.strip().split())
              counter += 1
      
      f.close()
      

      希望对你有帮助!

      【讨论】:

      • 不客气!如果它解决了您的问题,请选择我的答案作为接受的答案。
      猜你喜欢
      • 2020-02-28
      • 2019-10-04
      • 1970-01-01
      • 2013-04-19
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 2017-01-24
      • 2021-07-05
      相关资源
      最近更新 更多