From 06aa49ad6ff6fde0546ce30d06a5067d72f48d5a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Laurent?= <francois.laurent@posteo.net>
Date: Sun, 15 Jan 2023 21:54:34 +0100
Subject: [PATCH] Labels.encode and Labels.decode reworked; version increment
---
Project.toml | 2 +-
pyproject.toml | 2 +-
src/taggingbackends/data/labels.py | 57 +++++++++++++++++++++---------
3 files changed, 42 insertions(+), 19 deletions(-)
diff --git a/Project.toml b/Project.toml
index 4fefa10..1aebd82 100644
--- a/Project.toml
+++ b/Project.toml
@@ -1,7 +1,7 @@
name = "TaggingBackends"
uuid = "e551f703-3b82-4335-b341-d497b48d519b"
authors = ["François Laurent", "Institut Pasteur"]
-version = "0.7.2"
+version = "0.8"
[deps]
Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
diff --git a/pyproject.toml b/pyproject.toml
index 84e30fe..cb7e012 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[tool.poetry]
name = "TaggingBackends"
-version = "0.7.2"
+version = "0.8"
description = "Backbone for LarvaTagger.jl tagging backends"
authors = ["François Laurent"]
diff --git a/src/taggingbackends/data/labels.py b/src/taggingbackends/data/labels.py
index 3da447f..f9402f5 100644
--- a/src/taggingbackends/data/labels.py
+++ b/src/taggingbackends/data/labels.py
@@ -309,34 +309,57 @@ class Labels:
for timestamp, label in zip(track["t"], track["labels"])}
return self
- def encode(self, labels):
- if isinstance(self.labelspec, dict):
- labelset = self.labelspec["names"]
+ """
+ Encode the text labels as indices (`int` or `list` of `int`).
+
+ Labels are 1-indexed. If shifted down, the indices apply to attribute
+ `labelspec`.
+ """
+ def encode(self, label=None):
+ if label is None:
+ encoded = label = self
+ for run_larva in label:
+ label[run_larva] = self.encode(label[run_larva])
+ elif isinstance(label, dict):
+ encoded = {t: self.encode(l) for t, l in label.items()}
else:
- labelset = self.labelspec
- encoded = []
- for label in labels:
+ if isinstance(self.labelspec, dict):
+ labelset = self.labelspec['names']
+ else:
+ labelset = self.labelspec
if isinstance(label, str):
- encoded.append(labelset.index(label)+1)
+ encoded = labelset.index(label) + 1
+ elif isinstance(label, int):
+ encoded = label
+ logging.debug('label(s) already encoded')
else:
- encoded.append([labelset.index(label)+1 for label in label])
+ encoded = [labelset.index(l) + 1 for l in label]
return encoded
+ """
+ Decode the label indices as text (`str` or `list` of `str`).
+
+ Text labels are picked in `labelspec`.
+ """
def decode(self, label=None):
- if isinstance(self.labelspec, dict):
- labelset = self.labelspec["names"]
- else:
- labelset = self.labelspec
if label is None:
- label = decoded = self
+ decoded = label = self
for run_larva in label:
label[run_larva] = self.decode(label[run_larva])
elif isinstance(label, dict):
- decoded = {t: labelset[l-1] for t, l in label.items()}
- elif isinstance(label, int):
- decoded = labelset[label-1]
+ decoded = {t: self.decode(l) for t, l in label.items()}
else:
- decoded = [labelset[l-1] for l in label]
+ if isinstance(self.labelspec, dict):
+ labelset = self.labelspec['names']
+ else:
+ labelset = self.labelspec
+ if isinstance(label, int):
+ decoded = labelset[label-1]
+ elif isinstance(label, str):
+ decoded = label
+ logging.debug('label(s) already decoded')
+ else:
+ decoded = [labelset[l-1] for l in label]
return decoded
class LabelEncoder(json.JSONEncoder):
--
GitLab