用标头读取文件,然后将问题编码为numpy数组



我有一个像这样的文件(Zemax的PSF(:

Listing of FFT PSF Data
File : C:G_DriveProjectsMSETelescopeAAO_designsMSE_PF_6u_1300-Shan-Nicolas_2.zmx
Title: MSE Prime Focus WFC with CLADC
Date : 2/9/2018
Configuration 1 of 4
FFT PSF
0.5510 µm at 0.5300, 0.0000 (deg).
Data spacing is 0.300 µm.
Data area is 153.600 µm wide.
Surface: Image (Focal surface)
Reference Coordinates: 2.02066E+02, 0.00000E+00
Pupil grid size: 256 by 256
Image grid size: 512 by 512
Center point is: row 257, column 256
Values are normalized to peak = 1.0
  1.7638E-02      1.7079E-02      1.6531E-02      1.5996E-02      1.5475E-02    ...

因此,它具有带有文本的标题,我想象的是需要一些ISO-8859-1编码的字符。标头到512行512浮子之后,我想将其导入到一个numpy阵列中。

我从此开始:

data = ascii.read(path_in + files[0], data_start=19, encoding='iso-8859-1')
n = np.array(data)
n.shape

,但数组没有正确的形状:

(508,)

我也尝试了:

im = np.loadtxt(path_in + files[0], skiprows=19)

但是有以下错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb5 in position 211: invalid start byte

和np.loadtxt不接受其他编码。

然后,我尝试了以下操作:

arr = np.fromiter(codecs.open(path_in +files[0], encoding='iso-8859-1'), np.float)

但这不喜欢标题:

ValueError: could not convert string to float: 'Listing of FFT PSF Datarn'

最后,我在这里找到了一些类似的问题:将Unicode元素读为numpy阵列,但这是:

s = codecs.open(path_in + files[0], encoding='iso-8859-1').read()
im = np.loadtxt(s)

即使我经常碰到了率,也会给我"超过IOPUB数据率"错误消息。

解决方案是将loadtxt与Numpy 1.14一起使用,该encoding参数。

但是,要升级到Numpy 1.14,我必须切换到Anaconda-64。

最新更新