我正在使用numpy.unique来获取已经使用numpy.ravel展平的屏蔽数组的值,索引和计数,并且会得到意想不到的结果。
如果我手动测试它,如下所示:
>>> import numpy as np
>>> a = np.array([[1,2,3],[1,0,0],[2,1,5]])
>>> a
array([[1, 2, 3],
[1, 0, 0],
[2, 1, 5]])
>>> src = np.ma.masked_equal(a, 0)
>>> src
masked_array(data =
[[1 2 3]
[1 -- --]
[2 1 5]],
mask =
[[False False False]
[False True True]
[False False False]],
fill_value = 0)
>>> src = src.ravel()
>>> src
masked_array(data = [1 2 3 1 -- -- 2 1 5],
mask = [False False False False True True False False False],
fill_value = 0)
>>> s_values, s_idx, s_counts = np.unique(src, return_inverse=True, return_counts=True)
>>> s_values
masked_array(data = [1 2 3 5 --],
mask = [False False False False True],
fill_value = 0)
>>> s_counts
array([3, 2, 1, 1, 2])
但是,当我从图像文件中将相同的逻辑应用于uint8数组时,我得到以下内容:
>>> src_ds = '/Users/histo/S2_10_T_DN_2016_7_27_0_4328_repro.tif'
>>> src_ds = gdal.Open(src_ds)
>>> src = src_ds.GetRasterBand(1).ReadAsArray()
>>> src = np.ma.masked_equal(src, 0)
>>> src = src.ravel()
>>> s_values, s_idx, s_counts = np.unique(src, return_index=True, return_inverse=True)
>>> s_values
masked_array(data = [3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
55 56 57 58 59 60 61 62 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63
-- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 --
63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63
-- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 --
63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63
-- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 --
63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63
-- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 --
63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63
-- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 --
63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63
-- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 --
63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63
-- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 --
63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63
-- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 --
63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63
-- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 --
63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63
-- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 --
63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63
-- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 --
63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63
-- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 -- 63 64 65 66
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219
220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255],
mask = [False False False False False False False False False False False False
False False False False False False False False False False False False
False False False False False False False False False False False False
False False False False False False False False False False False False
False False False False False False False False False False False False
False True False True False True False True False True False True
False True False True False True False True False True False True
False True False True False True False True False True False True
False True False True False True False True False True False True
False True False True False True False True False True False True
False True False True False True False True False True False True
False True False True False True False True False True False True
False True False True False True False True False True False True
False True False True False True False True False True False True
False True False True False True False True False True False True
False True False True False True False True False True False True
False True False True False True False True False True False True
False True False True False True False True False True False True
False True False True False True False True False True False True
False True False True False True False True False True False True
False True False True False True False True False True False True
...
由于某种原因63和掩码一遍又一遍地重复作为唯一值,当然,它会抛出计数和索引,并使结果无法用于任何后续分析。
我尝试用ndimage打开数据,结果是一样的,我尝试过使用其他图像。再次,我得到重复值掩码值...作为唯一值。
很奇怪。有人见过这个吗?
答案 0 :(得分:3)
通过更改蒙版数组的默认填充值来解决此问题:
Error establishing a database connection
This either means that the username and password information in your wp-config.php file is incorrect or we can't contact the database server at localhost. This could mean your host's database server is down.
Are you sure you have the correct username and password?
Are you sure that you have typed the correct hostname?
Are you sure that the database server is running?
If you're unsure what these terms mean you should probably contact your host. If you still need help you can always visit the WordPress Support Forums.
此问题具有可重复性,并不适用于图像(请注意,只有在import numpy as np
x = np.array([64, 0, 1, 2, 3, 63, 63, 0, 0, 0, 1, 2, 0, 63, 0], dtype='uint8')
y = np.ma.masked_equal(x, 0)
v, i, c = np.unique(y, return_index=True, return_counts=True)
print(v)
# [1 2 3 -- 63 -- 63 -- 64]
np.ma.core.default_filler['u'] = 0 # fill value for unsigned integers
np.ma.core.default_filler['i'] = 0 # fill value for unsigned integers
v, i, c = np.unique(y, return_index=True, return_counts=True)
print(v)
# [-- 1 2 3 63 64]
时才会发生):
return_index=True
显然这与63号有关。63有什么特别之处?二进制它是所有的(在8位表示的情况下有两个前导零)。
import numpy as np
x = np.array([64, 0, 1, 2, 3, 62, 62, 0, 0, 0, 1, 2, 0, 62, 0], dtype='uint8')
y = np.ma.masked_equal(x, 0)
v, i, c = np.unique(y, return_index=True, return_counts=True)
print(v)
# [1 2 3 62 -- 64]
x = np.array([64, 0, 1, 2, 3, 63, 63, 0, 0, 0, 1, 2, 0, 63, 0], dtype='uint8')
y = np.ma.masked_equal(x, 0)
v, i, c = np.unique(y, return_index=True, return_counts=True)
print(v)
# [1 2 3 -- 63 -- 63 -- 64]
x = np.array([64, 0, 1, 2, 3, 63, 63, 0, 0, 0, 1, 2, 0, 63, 0], dtype='uint8')
y = np.ma.masked_equal(x, 0)
v = np.unique(y)
print(v)
# [1 2 3 63 64 --]
但是,我不知道为什么这个特定的数字(例如127个有效)会在与 >>> bin(63)
'0b111111'
结合使用时导致奇怪的行为。
这与排序数组有关。没有np.unique
np.unique内部使用return_indices
,否则使用np.sort
:
np.argsort
默认情况下,np.ma.argsort
使用函数np.ma.default_fill_value
在排序期间替换屏蔽值。 x = np.array([64, 0, 1, 2, 3, 63, 63, 0, 0, 0, 1, 2, 0, 63, 0], dtype='uint8')
y = np.ma.masked_equal(x, 0)
print(np.sort(y))
# [1 1 2 2 3 63 63 63 64 -- -- -- -- -- --]
print(y[np.argsort(y)])
# [1 1 2 2 3 -- 63 63 -- -- -- -- 63 -- 64]
(也用于int
)的默认填充值为999999.这是二进制0b111101000010 00111111 - 最低8位等于63!因此,对于排序算法,屏蔽值和63是等价的,它们是混杂在一起的。
可以更改默认填充值,从而解决问题:
uint8
作为一种解决方法,您可以将数据转换为另一种数据类型,例如浮点的16位整数:
np.ma.core.default_filler['u'] = 0 # fill value for unsigned integers
np.ma.core.default_filler['i'] = 0 # fill value for unsigned integers
特定用例的另一个替代方案是根本不使用掩码数组。由于只有0被掩码替换,因此很容易在结果中忽略0。