1
1
import numpy as np
2
2
from qtpy .QtCore import Qt
3
3
from qtpy .QtWidgets import (QWidget , QVBoxLayout , QListWidget , QSplitter , QDialogButtonBox , QHBoxLayout ,
4
- QDialog , QLabel )
4
+ QDialog , QLabel , QCheckBox )
5
5
6
6
from larray import LArray , Session , Axis , X , stack , full_like , nan , zeros_like , isnan , larray_nan_equal , nan_equal
7
7
from larray_editor .utils import ima , replace_inf , _
@@ -24,47 +24,63 @@ def __init__(self, parent=None):
24
24
layout .addLayout (maxdiff_layout )
25
25
26
26
self .arraywidget = ArrayEditorWidget (self , np .array ([]), readonly = True , bg_gradient = 'red-white-blue' )
27
+
28
+ diff_checkbox = QCheckBox (_ ('Differences Only' ))
29
+ diff_checkbox .stateChanged .connect (self .show_differences_only )
30
+ self .diff_checkbox = diff_checkbox
31
+ self .arraywidget .btn_layout .addWidget (diff_checkbox )
32
+
27
33
layout .addWidget (self .arraywidget )
28
34
35
+ self .array = None
36
+ self .isequal = None
37
+ self .bg_value = None
38
+ self .stack_axis = None
39
+
29
40
def set_data (self , arrays , stack_axis ):
30
41
assert all (np .isscalar (a ) or isinstance (a , LArray ) for a in arrays )
42
+ self .stack_axis = stack_axis
31
43
try :
32
- array = stack (arrays , stack_axis )
33
- array0 = array [stack_axis .i [0 ]]
44
+ self . array = stack (arrays , stack_axis )
45
+ array0 = self . array [stack_axis .i [0 ]]
34
46
except :
35
- array = LArray ([np .nan ])
36
- array0 = array
47
+ self . array = LArray ([np .nan ])
48
+ array0 = self . array
37
49
try :
38
- isequal = nan_equal (array , array0 )
50
+ self . isequal = nan_equal (self . array , array0 )
39
51
except TypeError :
40
- isequal = array == array0
52
+ self . isequal = self . array == array0
41
53
42
54
try :
43
55
with np .errstate (divide = 'ignore' , invalid = 'ignore' ):
44
- diff = array - array0
56
+ diff = self . array - array0
45
57
reldiff = diff / array0
46
58
# this is necessary for nan, inf and -inf (because inf - inf = nan, not 0)
47
59
# this is more precise than divnot0, it only ignore 0 / 0, not x / 0
48
- reldiff [isequal ] = 0
60
+ reldiff [self . isequal ] = 0
49
61
# replace -inf by min(reldiff), +inf by max(reldiff)
50
62
reldiff , relmin , relmax = replace_inf (reldiff )
51
63
maxabsreldiff = max (abs (relmin ), abs (relmax ))
52
64
if maxabsreldiff :
53
65
# scale reldiff to range 0-1 with 0.5 for reldiff = 0
54
- bg_value = (reldiff / maxabsreldiff ) / 2 + 0.5
66
+ self . bg_value = (reldiff / maxabsreldiff ) / 2 + 0.5
55
67
else :
56
- bg_value = full_like (array , 0.5 )
68
+ self . bg_value = full_like (self . array , 0.5 )
57
69
except TypeError :
58
70
# str/object array
59
71
maxabsreldiff = np .nan
60
- bg_value = full_like (array , 0.5 )
72
+ self . bg_value = full_like (self . array , 0.5 )
61
73
62
- # only show rows with a difference. For some reason, this is abysmally slow though.
63
- # row_filter = (~isequal).any('session')
64
- # array = array[row_filter]
65
- # bg_value = bg_value[row_filter]
66
74
self .maxdiff_label .setText (str (maxabsreldiff ))
67
- self .arraywidget .set_data (array , bg_value = bg_value )
75
+ self .arraywidget .set_data (self .array , bg_value = self .bg_value )
76
+
77
+ def show_differences_only (self , yes ):
78
+ if yes :
79
+ # only show rows with a difference. For some reason, this is abysmally slow though.
80
+ row_filter = (~ self .isequal ).any (self .stack_axis .name )
81
+ self .arraywidget .set_data (self .array [row_filter ], bg_value = self .bg_value [row_filter ])
82
+ else :
83
+ self .arraywidget .set_data (self .array , bg_value = self .bg_value )
68
84
69
85
70
86
class ArrayComparator (QDialog ):
0 commit comments