@@ -84,24 +84,6 @@ def get_transform(self):
84
84
return IdentityTransform ()
85
85
86
86
87
- def _mask_non_positives (a ):
88
- """
89
- Return a Numpy array where all non-positive values are
90
- replaced with NaNs. If there are no non-positive values, the
91
- original array is returned.
92
- """
93
- mask = a <= 0.0
94
- if mask .any ():
95
- return np .where (mask , np .nan , a )
96
- return a
97
-
98
-
99
- def _clip_non_positives (a ):
100
- a = np .array (a , float )
101
- a [a <= 0.0 ] = 1e-300
102
- return a
103
-
104
-
105
10000
87
class LogTransformBase (Transform ):
106
88
input_dims = 1
107
89
output_dims = 1
@@ -111,31 +93,37 @@ class LogTransformBase(Transform):
111
93
def __init__ (self , nonpos ):
112
94
Transform .__init__ (self )
113
95
if nonpos == 'mask' :
114
- self ._handle_nonpos = _mask_non_positives
96
+ self ._fill_value = np . nan
115
97
else :
116
- self ._handle_nonpos = _clip_non_positives
117
-
118
-
119
- class Log10Transform (LogTransformBase ):
120
- base = 10.0
98
+ self ._fill_value = 1e-300
121
99
122
100
def transform_non_affine (self , a ):
123
- a = self . _handle_nonpos (a * 10.0 )
124
- return np .log10 ( a )
125
-
126
- def inverted ( self ):
127
- return InvertedLog10Transform ()
101
+ a = np . where (a <= 0 , self . _fill_value , a )
102
+ np .log ( a , a )
103
+ a /= np . log ( self . base )
104
+ a += 1
105
+ return a
128
106
129
107
130
- class InvertedLog10Transform (Transform ):
108
+ class InvertedLogTransformBase (Transform ):
131
109
input_dims = 1
132
110
output_dims = 1
133
111
is_separable = True
134
112
has_inverse = True
135
- base = 10.0
136
113
137
114
def transform_non_affine (self , a ):
138
- return ma .power (10.0 , a ) / 10.0
115
+ return ma .power (self .base , a - 1 )
116
+
117
+
118
+ class Log10Transform (LogTransformBase ):
119
+ base = 10.0
120
+
121
+ def inverted (self ):
122
+ return InvertedLog10Transform ()
123
+
124
+
125
+ class InvertedLog10Transform (InvertedLogTransformBase ):
126
+ base = 10.0
139
127
140
128
def inverted (self ):
141
129
return Log10Transform ()
@@ -144,88 +132,45 @@ def inverted(self):
144
132
class Log2Transform (LogTransformBase ):
145
133
base = 2.0
146
134
147
- def transform_non_affine (self , a ):
148
- a = self ._handle_nonpos (a * 2.0 )
149
- return np .log2 (a )
150
-
151
135
def inverted (self ):
152
136
return InvertedLog2Transform ()
153
137
154
138
155
- class InvertedLog2Transform (Transform ):
156
- input_dims = 1
157
- output_dims = 1
158
- is_separable = True
159
- has_inverse = True
139
+ class InvertedLog2Transform (InvertedLogTransformBase ):
160
140
base = 2.0
161
141
162
- def transform_non_affine (self , a ):
163
- return ma .power (2.0 , a ) / 2.0
164
-
165
142
def inverted (self ):
166
143
return Log2Transform ()
167
144
168
145
169
146
class NaturalLogTransform (LogTransformBase ):
170
147
base = np .e
171
148
172
- def transform_non_affine (self , a ):
173
- a = self ._handle_nonpos (a * np .e )
174
- return np .log (a )
175
-
176
149
def inverted (self ):
177
150
return InvertedNaturalLogTransform ()
178
151
179
152
180
- class InvertedNaturalLogTransform (Transform ):
181
- input_dims = 1
182
- output_dims = 1
183
- is_separable = True
184
- has_inverse = True
153
+ class InvertedNaturalLogTransform (InvertedLogTransformBase ):
185
154
base = np .e
186
155
187
- def transform_non_affine (self , a ):
188
- return ma .power (np .e , a ) / np .e
189
-
190
156
def inverted (self ):
191
157
return NaturalLogTransform ()
192
158
193
159
194
- class LogTransform (Transform ):
195
- input_dims = 1
196
- output_dims = 1
197
- is_separable = True
198
- has_inverse = True
199
-
160
+ class LogTransform (LogTransformBase ):
200
161
def __init__ (self , base , nonpos ):
201
- Transform .__init__ (self )
162
+ LogTransformBase .__init__ (self , nonpos )
202
163
self .base = base
203
- if nonpos == 'mask' :
204
- self ._handle_nonpos = _mask_non_positives
205
- else :
206
- self ._handle_nonpos = _clip_non_positives
207
-
208
- def transform_non_affine (self , a ):
209
- a = self ._handle_nonpos (a * self .base )
210
- return np .log (a ) / np .log (self .base )
211
164
212
165
def inverted (self ):
213
166
return InvertedLogTransform (self .base )
214
167
215
168
216
- class InvertedLogTransform (Transform ):
217
- input_dims = 1
218
- output_dims = 1
219
- is_separable = True
220
- has_inverse = True
221
-
169
+ class InvertedLogTransform (InvertedLogTransformBase ):
222
170
def __init__ (self , base ):
223
- Transform .__init__ (self )
171
+ InvertedLogTransformBase .__init__ (self )
224
172
self .base = base
225
173
226
- def transform_non_affine (self , a ):
227
- return ma .power (self .base , a ) / self .base
228
-
229
174
def inverted (self ):
230
175
return LogTransform (self .base )
231
176
@@ -474,25 +419,6 @@ def get_transform(self):
474
419
return self ._transform
475
420
476
421
477
- def _mask_non_logit (a ):
478
- """
479
- Return a Numpy array where all values outside ]0, 1[ are
480
- replaced with NaNs. If all values are inside ]0, 1[, the original
481
- array is returned.
482
- """
483
- mask = (a <= 0.0 ) | (a >= 1.0 )
484
- if mask .any ():
485
- return np .where (mask , np .nan , a )
486
- return a
487
-
488
-
489
- def _clip_non_logit (a ):
490
- a = np .array (a , float )
491
- a [a <= 0.0 ] = 1e-300
492
- a [a >= 1.0 ] = 1 - 1e-300
493
- return a
494
-
495
-
496
422
class LogitTransform (Transform ):
497
423
input_dims = 1
498
424
output_dims = 1
@@ -502,14 +428,15 @@ class LogitTransform(Transform):
502
428
def __init__ (self , nonpos ):
503
429
Transform .__init__ (self )
504
430
if nonpos == 'mask' :
505
- self ._handle_nonpos = _mask_non_logit
431
+ self ._fill_value = np . nan
506
432
else :
507
- self ._handle_nonpos = _clip_non_logit
433
+ self ._fill_value = 1e-300
508
434
self ._nonpos = nonpos
509
435
510
436
def transform_non_affine (self , a ):
511
437
"""logit transform (base 10), masked or clipped"""
512
- a = self ._handle_nonpos (a )
438
+ a = np .select (
439
+ [a <= 0 , a >= 1 ], [self ._fill_value , 1 - self ._fill_value ], a )
513
440
return np .log10 (1.0 * a / (1.0 - a ))
514
441
515
442
def inverted (self ):
0 commit comments