Python 使用numpy genfromtxt使用文本标题将单列中的数据读入多列

Python 使用numpy genfromtxt使用文本标题将单列中的数据读入多列,python,arrays,numpy,genfromtxt,Python,Arrays,Numpy,Genfromtxt,我正在尝试使用genfromtxt从文件中导入一组预定义x、y点的一些数据(压力、应力)。其中,数据仅输出为一个长列,由标题名称分割,例如: xx=np.reshape(time3,307,4) print xx 时间 1.0022181 毛孔_PRE -18438721.41 -18438721.41 ........ STRS_11 -28438721.41 -28438721.41 ........ 时间数据只有一个点,但PORE_PRE和Str_11以及其他变量包含许多但

我正在尝试使用genfromtxt从文件中导入一组预定义x、y点的一些数据(压力、应力)。其中,数据仅输出为一个长列,由标题名称分割,例如:

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

毛孔_PRE
-18438721.41
-18438721.41
........

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

时间数据只有一个点,但PORE_PRE和Str_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类型的性质,这是不可能的

 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
xx=time3.view(dtype=np.float)
ValueError: new type not compatible with array

有没有人能建议我如何处理阅读文件的问题

您需要以块的形式读取文件
genfromtxt
接受来自任何iterable、字符串列表、生成器、打开的文件等的输入。因此,您需要一个脚本来打开文件,读取块的行,并对这些行调用
genfromtxt
,将结果保存在列表中。最后,您可以将这些子阵列收集到一个阵列中

有一个使用
readlines
的简单示例。从一系列行开始工作是发展你的想法的最简单的方法——找到块的边界等等。如果你不想在内存中保存完整的文件,你可以在以后将其修改为生成器或过滤器结构

对合并结构化数组进行了扩展讨论

示例脚本:

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')])
如果我将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')])

[827]中的
:x=np.zeros((2,),dtype=[('PORE_PRE','times3的形状和dtype是什么?
?谢谢你的回答-我直到下周才有机会测试,但我可以看到你已经解决了我的问题,非常感谢你的帮助!