Skip to content

Commit bacb5c0

Browse files
committed
fix #102: added checkbox in comparator to show only differences
1 parent b7b3901 commit bacb5c0

File tree

2 files changed

+40
-24
lines changed

2 files changed

+40
-24
lines changed

larray_editor/arraywidget.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -619,20 +619,20 @@ def __init__(self, parent, data=None, readonly=False, bg_value=None, bg_gradient
619619

620620
# Set filters and buttons layout
621621
self.filters_layout = QHBoxLayout()
622-
btn_layout = QHBoxLayout()
623-
btn_layout.setAlignment(Qt.AlignLeft)
622+
self.btn_layout = QHBoxLayout()
623+
self.btn_layout.setAlignment(Qt.AlignLeft)
624624

625625
label = QLabel("Digits")
626-
btn_layout.addWidget(label)
626+
self.btn_layout.addWidget(label)
627627
spin = QSpinBox(self)
628628
spin.valueChanged.connect(self.digits_changed)
629629
self.digits_spinbox = spin
630-
btn_layout.addWidget(spin)
630+
self.btn_layout.addWidget(spin)
631631

632632
scientific = QCheckBox(_('Scientific'))
633633
scientific.stateChanged.connect(self.scientific_changed)
634634
self.scientific_checkbox = scientific
635-
btn_layout.addWidget(scientific)
635+
self.btn_layout.addWidget(scientific)
636636

637637
gradient_chooser = QComboBox()
638638
gradient_chooser.setMaximumSize(120, 20)
@@ -659,14 +659,14 @@ def __init__(self, parent, data=None, readonly=False, bg_value=None, bg_gradient
659659
# select default gradient
660660
gradient_chooser.setCurrentText(bg_gradient)
661661
gradient_chooser.currentIndexChanged.connect(self.gradient_changed)
662-
btn_layout.addWidget(gradient_chooser)
662+
self.btn_layout.addWidget(gradient_chooser)
663663
self.gradient_chooser = gradient_chooser
664664

665665
# Set widget layout
666666
layout = QVBoxLayout()
667667
layout.addLayout(self.filters_layout)
668668
layout.addWidget(array_frame)
669-
layout.addLayout(btn_layout)
669+
layout.addLayout(self.btn_layout)
670670
layout.setContentsMargins(0, 0, 0, 0)
671671
self.setLayout(layout)
672672
self.set_data(data, bg_value=bg_value)

larray_editor/comparator.py

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import numpy as np
22
from qtpy.QtCore import Qt
33
from qtpy.QtWidgets import (QWidget, QVBoxLayout, QListWidget, QSplitter, QDialogButtonBox, QHBoxLayout,
4-
QDialog, QLabel)
4+
QDialog, QLabel, QCheckBox)
55

66
from larray import LArray, Session, Axis, X, stack, full_like, nan, zeros_like, isnan, larray_nan_equal, nan_equal
77
from larray_editor.utils import ima, replace_inf, _
@@ -24,47 +24,63 @@ def __init__(self, parent=None):
2424
layout.addLayout(maxdiff_layout)
2525

2626
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+
2733
layout.addWidget(self.arraywidget)
2834

35+
self.array = None
36+
self.isequal = None
37+
self.bg_value = None
38+
self.stack_axis = None
39+
2940
def set_data(self, arrays, stack_axis):
3041
assert all(np.isscalar(a) or isinstance(a, LArray) for a in arrays)
42+
self.stack_axis = stack_axis
3143
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]]
3446
except:
35-
array = LArray([np.nan])
36-
array0 = array
47+
self.array = LArray([np.nan])
48+
array0 = self.array
3749
try:
38-
isequal = nan_equal(array, array0)
50+
self.isequal = nan_equal(self.array, array0)
3951
except TypeError:
40-
isequal = array == array0
52+
self.isequal = self.array == array0
4153

4254
try:
4355
with np.errstate(divide='ignore', invalid='ignore'):
44-
diff = array - array0
56+
diff = self.array - array0
4557
reldiff = diff / array0
4658
# this is necessary for nan, inf and -inf (because inf - inf = nan, not 0)
4759
# this is more precise than divnot0, it only ignore 0 / 0, not x / 0
48-
reldiff[isequal] = 0
60+
reldiff[self.isequal] = 0
4961
# replace -inf by min(reldiff), +inf by max(reldiff)
5062
reldiff, relmin, relmax = replace_inf(reldiff)
5163
maxabsreldiff = max(abs(relmin), abs(relmax))
5264
if maxabsreldiff:
5365
# 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
5567
else:
56-
bg_value = full_like(array, 0.5)
68+
self.bg_value = full_like(self.array, 0.5)
5769
except TypeError:
5870
# str/object array
5971
maxabsreldiff = np.nan
60-
bg_value = full_like(array, 0.5)
72+
self.bg_value = full_like(self.array, 0.5)
6173

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]
6674
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)
6884

6985

7086
class ArrayComparator(QDialog):

0 commit comments

Comments
 (0)