У меня есть 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)