@@ -983,13 +983,15 @@ def test_numpy_rw_band_read_as_array_getlasterrormsg():
983983def test_numpy_rw_masked_array_1 ():
984984
985985 ds = gdal .Open ("data/byte.tif" )
986-
987986 band = ds .GetRasterBand (1 )
988987
989988 masked_arr = band .ReadAsMaskedArray ()
990-
991989 assert not numpy .any (masked_arr .mask )
992990
991+ ds_masked_arr = ds .ReadAsMaskedArray ()
992+ assert not numpy .any (ds_masked_arr .mask )
993+ assert numpy .all (masked_arr == ds_masked_arr )
994+
993995
994996def test_numpy_rw_masked_array_2 ():
995997
@@ -1007,6 +1009,90 @@ def test_numpy_rw_masked_array_2():
10071009
10081010 assert masked_arr .sum () == arr [mask == 255 ].sum ()
10091011
1012+ ds_masked_arr = ds .ReadAsMaskedArray ()
1013+ assert numpy .all (ds_masked_arr .mask == masked_arr .mask )
1014+ assert numpy .all (ds_masked_arr .data == masked_arr .data )
1015+
1016+
1017+ ###############################################################################
1018+ # Test dataset read into a masked array
1019+
1020+
1021+ def test_numpy_rw_masked_array_3 ():
1022+
1023+ nx = 6
1024+ ny = 4
1025+ nz = 3
1026+ nodata = - 999
1027+
1028+ ds = gdal .GetDriverByName ("MEM" ).Create ("" , nx , ny , nz , eType = gdal .GDT_Int16 )
1029+ for i in range (nz ):
1030+ ds .GetRasterBand (i + 1 ).SetNoDataValue (nodata )
1031+
1032+ data = numpy .arange (nx * ny * nz ).reshape (nz , ny , nx ).astype (numpy .int16 )
1033+ data [:, 1 , 1 ] = nodata
1034+ ds .WriteArray (data )
1035+
1036+ masked_data = numpy .ma .masked_array (data , mask = data == nodata )
1037+
1038+ assert numpy .ma .allequal (masked_data , ds .ReadAsMaskedArray ())
1039+
1040+ # read a single band
1041+ assert numpy .ma .allequal (masked_data [1 , :, :], ds .ReadAsMaskedArray (band_list = [2 ]))
1042+
1043+ # read multiple bands
1044+ assert numpy .ma .allequal (
1045+ numpy .ma .stack ((masked_data [2 , :, :], masked_data [0 , :, :])),
1046+ ds .ReadAsMaskedArray (band_list = [3 , 1 ]),
1047+ )
1048+
1049+ # read a sub-window (square)
1050+ assert numpy .ma .allequal (
1051+ numpy .ma .stack ((masked_data [2 , 0 :2 , 1 :3 ], masked_data [0 , 0 :2 , 1 :3 ])),
1052+ ds .ReadAsMaskedArray (band_list = [3 , 1 ], xsize = 2 , ysize = 2 , xoff = 1 , yoff = 0 ),
1053+ )
1054+
1055+ # read a sub-window (single pixel)
1056+ assert numpy .ma .allequal (
1057+ numpy .ma .stack ((masked_data [2 , 1 :2 , 1 :2 ], masked_data [0 , 1 :2 , 1 :2 ])),
1058+ ds .ReadAsMaskedArray (band_list = [3 , 1 ], xsize = 1 , ysize = 1 , xoff = 1 , yoff = 1 ),
1059+ )
1060+
1061+ # read a sub-window (read 2x2 square into 4x4 square)
1062+ assert numpy .ma .allequal (
1063+ numpy .ma .repeat (
1064+ numpy .ma .repeat (
1065+ numpy .ma .stack ((masked_data [2 , 0 :2 , 1 :3 ], masked_data [0 , 0 :2 , 1 :3 ])),
1066+ 2 ,
1067+ axis = 2 ,
1068+ ),
1069+ 2 ,
1070+ axis = 1 ,
1071+ ),
1072+ ds .ReadAsMaskedArray (
1073+ band_list = [3 , 1 ], xsize = 2 , ysize = 2 , xoff = 1 , yoff = 0 , buf_xsize = 4 , buf_ysize = 4
1074+ ),
1075+ )
1076+
1077+ # read a sub-window (read 2x2 square into single pixel)
1078+ assert numpy .ma .allequal (
1079+ numpy .ma .mean (
1080+ numpy .ma .stack ((masked_data [2 , 0 :2 , 1 :3 ], masked_data [0 , 0 :2 , 1 :3 ])),
1081+ axis = (1 , 2 ),
1082+ keepdims = True ,
1083+ ).round (),
1084+ ds .ReadAsMaskedArray (
1085+ band_list = [3 , 1 ],
1086+ xsize = 2 ,
1087+ ysize = 2 ,
1088+ xoff = 1 ,
1089+ yoff = 0 ,
1090+ buf_xsize = 1 ,
1091+ buf_ysize = 1 ,
1092+ resample_alg = gdal .GRIORA_Average ,
1093+ ),
1094+ )
1095+
10101096
10111097###############################################################################
10121098# Test type code mapping
0 commit comments