如何在numpy中读取非结构化ASCII数据?

如何在numpy中读取非结构化ASCII数据?,numpy,ascii,Numpy,Ascii,我需要将非结构化ASCII数据读入numpy数组。例如,文件可能如下所示: August 2005 OMI/MLS Tropo O3 Column (Dobson Units) X 10 Longitudes: 288 bins centered on 179.375W to 179.375E (1.25 degree steps) Latitudes: 120 bins centered on -59.5S to 59.5N (1.00 degree steps) 3283223133

我需要将非结构化ASCII数据读入numpy数组。例如,文件可能如下所示:

August 2005  OMI/MLS Tropo O3 Column (Dobson Units) X 10
Longitudes:  288 bins centered on 179.375W to 179.375E (1.25 degree steps)
Latitudes:  120 bins centered on -59.5S to 59.5N (1.00 degree steps)
 328322313320278255239243234240225243250276274188185228257307324334334266313
 302258249235303178184163133153233228193216245221235281235224200210217230239
 191168179199198202222218245272269260258253218217210250231221213216240220230
 216279262220205244255248266272235220215247221247253256261267284338317329327
 275288270253286272233215227999999999999999999999999999999999999999999999239
 242999999999999999999999999999999999999999999999999999999999999999999999999
 999999999999999999999999999636424663381417483472317200246338302140324258325
 317230243347274290259261255330322375318317342306373366375352345250278335368
 375393564999999999999999999999999999438341418448231272245265308299313365342
 345314325296273307328359375259284351376369317330358317321366329340334339373
 407376272226292357341348382369355358374361347367379368403379381398398391323
 347378367379364312306309280258236214206  lat =  -59.5
 316310310293280262250206199190174179239247204207187196190270280309302278294
 308261231270273168191184156219199179222218215193232261268223237236261272214
 236220178158177207189221200198234246226229180204217215226241245235215222225
 209205234227275264281264261234208289284263250249258265225251284273276301269
 239243250255236228260229255329236284274231245262999999999999999999999999999
 999999999999999459638999999999999999999999999999999999999999999999999999999
 366999999999999999999582427465386389430321336350319362400413409449373362351
 271274248359373294236244235229267275324307397319313380360399346279304265237
 247239249134219323393348313334215295273333329373309298298304349363369356338
 319343300279282287322317319324342311372379331353318288305319319373341352331
 354353342325316319356388409388344360388383361374397365361341379362384403407
 350343334328301279293228252243246231241  lat =  -58.5
跳过前三行后,接下来的每12行都包含整个二维数组的一行。它是由三位数字串联而成的

在numpy中有没有一种方法可以很好地做到这一点
loadtxt
需要一个
分隔符
关键字,但我这里没有分隔符,所以我迷路了

当然,这一切都可以通过手工完成,即手动读取文件、计算行数、拆分字符串并分别转换它们。但这相当麻烦。所以我在找更优雅的东西


编辑:可以忽略
lat=XXXXX
。我可以很容易地从标题信息重建纬度。

有点小技巧,但它不能“手动”读取

您可以使用
分隔符=[length of widths]
,因为每行的第一个值都有一个空格,这使得它的宽度
4

您可以忽略带有
注释='l'


最大的问题是,您必须重新整形然后切断(因为最后一行文件较短,数组不是“矩形”的,因此它填充了
-1
s。这要求您了解一些有关文件形状/大小的信息。

有点老套,但它不会“手动”读取

您可以使用
分隔符=[length of widths]
,因为每行的第一个值都有一个空格,这使得它的宽度
4

您可以忽略带有
注释='l'


最大的问题是,你必须重塑,然后切断(因为最后一个文件行较短,所以数组不是“矩形”的,所以它填充了
-1
s。这要求您了解文件的形状/大小。

我们是否应该忽略
lat=-59.5
s?是。请参阅更新的问题。我们是否应该忽略
lat=-59.5
s?是。请参阅更新的问题。您很好me!有了关于该文件的更多信息,您可能会使其更加健壮。例如,将
nrows=2
替换为
(latmax-latmin)/latstep
,例如..最后一行是一个真正的痛苦:P不客气!有了关于该文件的更多信息,您可能会使它更健壮。例如,用
(latmax latmin)/latstep
替换
nrows=2
,例如..最后一行是一个真正的痛苦:P
nrows = 2
ncols = 25

nlines = 12
lastline = 13

a = np.genfromtxt('tmp.txt',
                  skip_header=3,
                  delimiter=[4]+[3,]*(ncols-1),
                  comments='l',
                  dtype=int)
a = a.reshape(nrows,-1)[:,:ncols*(nlines-1)+lastline]