Чтение многоканального растрового двоичного файла с чередованием по линии (BIL) в массив 3d numpy - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть 0000 многоканальных двоичных растровых файлов, которые чередуются по линии (BIL), а некоторые чередуются последовательно (BSQ). Я хотел бы получить их в 3D numpy массивах как [полосы, строки, столбцы] для обработки. BSQ можно сделать просто используя numpy .reshape:

np.fromfile(file, datatype).reshape(bands, rows, columns)

Однако у меня возникают проблемы с чем-то столь же простым для файлов BIL. Я могу получить 2d массив, который имеет массив для каждой строки, причем данные каждой полосы для этой строки следуют друг за другом, используя:

np.fromfile(file, datatype).reshape(rows, -1)

Или я могу получить массив 3d, который имеет форму [ Rows, Bands, Columns] с использованием:

np.fromfile(file, datatype).reshape(rows, bands, columns)

и последующего доступа к отдельным массивам полос с помощью:

arr_name[:, band, :]

В идеале я хотел бы найти решение numpy, чтобы воспользоваться его возможности векторизации, учитывая, что существует значительное число из них для потенциальной обработки. Я знаю, что мог бы создать для l oop доступ к каждой группе и сложить их, чтобы создать 3d-растр, который мне нужен, например:

lst_temp = []
for i in range(arr_name.shape[1]):
    a = arr_name[:, i, :]
    lst_temp.append(a)
arr_stack = np.stack(lst_temp, axis = 0)

Я также знаю, что растерио может сделать это, но надеясь по возможности избежать GDAL-зависимостей.

Редактировать: добавлен пример кода ниже.

# Example input, where each no. is Row, Col, Band.  e.g. no. 243 is row 2, col 4, band 3. 
test_bil = np.array([111, 121, 131, 141, 151, 161, 171, 181, 191, 
                  112, 122, 132, 142, 152, 162, 172, 182, 192,
                  113, 123, 133, 143, 153, 163, 173, 183, 193,
                  114, 124, 134, 144, 154, 164, 174, 184, 194,
                  211, 221, 231, 241, 251, 261, 271, 281, 291,
                  212, 222, 232, 242, 252, 262, 272, 282, 292,
                  213, 223, 233, 243, 253, 263, 273, 283, 293,
                  214, 224, 234, 244, 254, 264, 274, 284, 294,
                  311, 321, 331, 341, 351, 361, 371, 381, 391,
                  312, 322, 332, 342, 352, 362, 372, 382, 392,
                  313, 323, 333, 343, 353, 363, 373, 383, 393,
                  314, 324, 334, 344, 354, 364, 374, 384, 394,
                  411, 421, 431, 441, 451, 461, 471, 481, 491,
                  412, 422, 432, 442, 452, 462, 472, 482, 492,
                  413, 423, 433, 443, 453, 463, 473, 483, 493,
                  414, 424, 434, 444, 454, 464, 474, 484, 494,
                  511, 521, 531, 541, 551, 561, 571, 581, 591,
                  512, 522, 532, 542, 552, 562, 572, 582, 592,
                  513, 523, 533, 543, 553, 563, 573, 583, 593,
                  514, 524, 534, 544, 554, 564, 574, 584, 594,
                  611, 621, 631, 641, 651, 661, 671, 681, 691,
                  612, 622, 632, 642, 652, 662, 672, 682, 692,
                  613, 623, 633, 643, 653, 663, 673, 683, 693,
                  614, 624, 634, 644, 654, 664, 674, 684, 694])
row_data = test_bil.reshape(6, 4, 9)
row_data[:, 0, :] # gives me the array I want for the band specified.
# stack the arrays
lst_temp = []
for i in range(row_data.shape[1]):
    a = rowscols[:, i, :]
    lst_temp.append(a)
bil_3darray = np.stack(lst_temp, axis = 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...