Как читать неструктурированные данные ASCII в NumPy?
Мне нужно читать неструктурированные данные ASCII в массивы. Например, файл может выглядеть так:
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 строк содержит одну строку всего двумерного массива. Это связано int
из трех цифр каждый.
Есть ли способ сделать это (несколько) красиво в NumPy? loadtxt
нужен delimiter
ключевое слово, но у меня нет разделителя здесь, поэтому я потерян.
Конечно, все это можно сделать вручную, то есть вручную прочитать файл, сосчитать строки, разбить строки и преобразовать их по отдельности. Но это довольно громоздко. Поэтому я ищу что-то более элегантное.
РЕДАКТИРОВАТЬ: lat = XXXXX
можно игнорировать Я могу легко восстановить широты из информации заголовка.
1 ответ
Немного взлома, но он не читает это "от руки".
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]
Ты можешь использовать delimiter = [length of widths]
который для вас [4, 3, 3, 3, ...]
потому что первое значение каждой строки имеет пробел, который делает его ширину 4
,
Вы можете игнорировать lat = ...
с comments = 'l'
Самая большая проблема заключается в том, что вам нужно изменить форму, а затем обрезать (поскольку последняя строка файла короче, массив не является "прямоугольным", поэтому он заполняется -1
s. Это требует, чтобы вы знали кое-что о форме / размере вашего файла.