使用numpy genfromtxt使用文本标题

时间:2016-02-19 17:00:21

标签: python arrays numpy genfromtxt

我正在尝试使用genfromtxt从文件导入一组预定义的x,y点的数据(压力,压力)。数据只是作为由标题名称拆分的长列输出,例如:

  

时间
  1.0022181

     

PORE_PRE
  -18438721.41
  -18438721.41
  ........

     

STRS_11
  -28438721.41
  -28438721.41
  ........

时间数据只有一个点,但PORE_PRE和STRS_11以及其他变量包含许多但数量相等的数据点。我使用以下代码:

import numpy as np
import matplotlib.pyplot as plt


file1=open('Z:/EFNHigh_Res/data_tstep1.out','r')
time=np.genfromtxt(file1,names=None,dtype=None,autostrip=True)

使用此代码,我得到一个结构化数组,其中包含一列中的所有数据。我已经设法通过删除前两行来删除时间。

我最初的想法是使用我之前找到的与数据点数量相关的信息以及列中数据点的总数来重新整形数组。例如:

xx=np.reshape(time3,307,4)
print xx

但是我得到了下面的错误,并且似乎无法找到重塑它的方法,由于数组的1D类型特性,我猜测由于某种原因它是不可能的。 / p>

 File "Z:\EFNHigh_Res\plotting.py", line 39, in <module>
    xx=np.reshape(time3,307,4)
  File "C:\Python27\ArcGIS10.2\lib\site-packages\numpy\core\fromnumeric.py",line 171, in reshape
    return reshape(newshape, order=order)
ValueError: total size of new array must be unchanged

我对输出格式没有太多选择(除了更复杂的安排)。看起来它应该是一个简单的操作,但我无法弄明白,但我对python很新。 我还尝试使用以下代码仅查看浮点数据,但是我得到如下错误,或者数据点数量非常多,大于数组中包含的数据。

xx=time3.view(dtype=np.float)
ValueError: new type not compatible with array

任何人都可以建议我如何处理阅读文件?

1 个答案:

答案 0 :(得分:0)

您需要以块为单位读取文件。 genfromtxt接受来自任何可迭代,字符串列表,生成器,打开文件等的输入。因此,您需要一个脚本来打开文件,读取块的行,并调用genfromtxt on那些,将结果保存在列表中。最后,您可以将这些子数组收集到一个数组中。

https://stackoverflow.com/a/34729730/901925有一个使用readlines的简单示例。从行列表开始工作是开发想法的最简单方法 - 找到块的边界等。如果您不想在内存中存储完整文件,可以稍后将其重新编写为生成器或过滤器结构。

https://stackoverflow.com/a/35495412/901925对合并结构化数组进行了广泛的讨论。

示例脚本:

import numpy as np

lines = open('stack35510689.txt').readlines()
print lines
time = float(lines[1].strip())
print time
arr1 = np.genfromtxt(lines[3:6], names=True)
print repr(arr1)
arr2 = np.genfromtxt(lines[7:10], names=True)
print repr(arr2)

import numpy.lib.recfunctions as rfn
print repr(rfn.merge_arrays([arr1,arr2]))

示例来源

time
1.0022181

PORE_PRE
-18438721.41
-18438721.41

STRS_11
-28438721.41
-28438721.41

示例输出

1009:~/mypy$ python stack35510689.py
['time\n', '1.0022181\n', '\n', 'PORE_PRE\n', '-18438721.41\n', '-18438721.41\n', '\n', 'STRS_11\n', '-28438721.41\n', '-28438721.41\n']
1.0022181
array([(-18438721.41,), (-18438721.41,)], 
      dtype=[('PORE_PRE', '<f8')])
array([(-28438721.41,), (-28438721.41,)], 
      dtype=[('STRS_11', '<f8')])
array([(-18438721.41, -28438721.41), (-18438721.41, -28438721.41)], 
      dtype=[('PORE_PRE', '<f8'), ('STRS_11', '<f8')])

使用一个genfromtxt读取同一个文件会产生一个字符串数组

In [819]: data=np.genfromtxt('stack35510689.txt',names=None,dtype=None,autostrip=True)
In [820]: data
Out[820]: 
array(['time', '1.0022181', 'PORE_PRE', '-18438721.41', '-18438721.41',
       'STRS_11', '-28438721.41', '-28438721.41'], 
      dtype='|S12')

如果我将dtype更改为float,我会得到数字,nan表示字符串为

In [821]: data=np.genfromtxt('stack35510689.txt',names=None,dtype=float,autostrip=True)

In [822]: data
Out[822]: 
array([             nan,   1.00221810e+00,              nan,
        -1.84387214e+07,  -1.84387214e+07,              nan,
        -2.84387214e+07,  -2.84387214e+07])

我可以通过切片来收集数字

In [826]: np.array([data[3:5],data[6:8]])
Out[826]: 
array([[-18438721.41, -18438721.41],
       [-28438721.41, -28438721.41]])

或制作像之前一样的结构化数组

In [827]: x=np.zeros((2,),dtype=[('PORE_PRE', '<f8'), ('STRS_11', '<f8')])
In [828]: x['PORE_PRE']=data[3:5]
In [829]: x['STRS_11']=data[6:8]
In [830]: x
Out[830]: 
array([(-18438721.41, -28438721.41), (-18438721.41, -28438721.41)], 
      dtype=[('PORE_PRE', '<f8'), ('STRS_11', '<f8')])