Python 使用numpy genfromtxt使用文本标题将单列中的数据读入多列
我正在尝试使用genfromtxt从文件中导入一组预定义x、y点的一些数据(压力、应力)。其中,数据仅输出为一个长列,由标题名称分割,例如: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以及其他变量包含许多但
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是什么?
?谢谢你的回答-我直到下周才有机会测试,但我可以看到你已经解决了我的问题,非常感谢你的帮助!