Skip to content

Commit f00225a

Browse files
committed
Improve efficiency of the NXfield index function
1 parent 2f8219a commit f00225a

1 file changed

Lines changed: 18 additions & 19 deletions

File tree

src/nexusformat/nexus/tree.py

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3465,37 +3465,36 @@ def index(self, value, max=False):
34653465
if self.ndim != 1:
34663466
raise NeXusError(
34673467
"NXfield must be one-dimensional to use the index function")
3468-
if self.nxdata[-1] < self.nxdata[0]:
3469-
flipped = True
3470-
else:
3471-
flipped = False
3468+
data = self.nxdata
3469+
count = len(data)
3470+
if count == 0:
3471+
return 0
3472+
flipped = data[-1] < data[0]
34723473
if max:
34733474
if flipped:
3474-
idx = np.max(len(self.nxdata) -
3475-
len(self.nxdata[self.nxdata < value])-1, 0)
3475+
idx = np.maximum(count - np.count_nonzero(data < value) - 1, 0)
34763476
else:
3477-
idx = np.max(len(self.nxdata) -
3478-
len(self.nxdata[self.nxdata > value])-1, 0)
3477+
idx = np.maximum(count - np.count_nonzero(data > value) - 1, 0)
34793478
try:
3480-
diff = value - self.nxdata[idx]
3481-
step = self.nxdata[idx+1] - self.nxdata[idx]
3479+
diff = value - data[idx]
3480+
step = data[idx+1] - data[idx]
34823481
if abs(diff/step) > 0.01:
3483-
idx = idx + 1
3484-
except IndexError:
3482+
idx += 1
3483+
except (IndexError, ZeroDivisionError):
34853484
pass
34863485
else:
34873486
if flipped:
3488-
idx = len(self.nxdata[self.nxdata > value])
3487+
idx = np.count_nonzero(data > value)
34893488
else:
3490-
idx = len(self.nxdata[self.nxdata < value])
3489+
idx = np.count_nonzero(data < value)
34913490
try:
3492-
diff = value - self.nxdata[idx-1]
3493-
step = self.nxdata[idx] - self.nxdata[idx-1]
3491+
diff = value - data[idx-1]
3492+
step = data[idx] - data[idx-1]
34943493
if abs(diff/step) < 0.99:
3495-
idx = idx - 1
3496-
except IndexError:
3494+
idx -= 1
3495+
except (IndexError, ZeroDivisionError):
34973496
pass
3498-
return int(np.clip(idx, 0, len(self.nxdata)-1))
3497+
return int(np.clip(idx, 0, count - 1))
34993498

35003499
def __array__(self, *args, **kwargs):
35013500
"""Cast the NXfield as a NumPy array."""

0 commit comments

Comments
 (0)