goofi v3.0.0

SampleEntropy

Sample entropy: how rarely a pattern that recurred keeps recurring.

Explore this node in the cookbook →

SampleEntropy py
data
entropy
Type name
signal:SampleEntropy
Plane
signal
Tags
analysis
Language
python
Tier
in-process
Bundle
complexity
Source
node-bundles/complexity/sample_entropy.py
Availability
available

Slots

SlotDirectionType
datainputARRAY
entropyoutputARRAY

Parameters

sample

NameTypeDefaultRangeDoc
orderint21 … 10How many samples make one pattern.
metricstringchebyshevchebyshev | euclideanHow far apart two patterns may be to match.
approximateboolfalseCount a pattern as matching itself: approximate entropy, the older biased form.

Source

The current source of this node, as it stands in the goofi repository at node-bundles/complexity/sample_entropy.py.

node-bundles/complexity/sample_entropy.py
"""SampleEntropy — how unpredictable a signal is, from antropy.

Counts how often a short pattern that recurred keeps recurring one sample longer; a signal that
is regular scores near 0. The last axis is time and is consumed; every axis before it survives.
"""

import antropy
import numpy as np
import goofi


class SampleEntropy(goofi.Node):
    """Sample entropy: how rarely a pattern that recurred keeps recurring."""

    TAGS = ["analysis"]
    INPUTS = {"data": goofi.InputSlot(goofi.DataType.ARRAY, required=True)}
    OUTPUTS = {"entropy": goofi.DataType.ARRAY}
    PARAMS = {
        "sample": {
            "order": goofi.IntParam(2, 1, 10, doc="How many samples make one pattern."),
            "metric": goofi.StringParam(
                "chebyshev", ["chebyshev", "euclidean"], doc="How far apart two patterns may be to match."
            ),
            "approximate": goofi.BoolParam(
                False, doc="Count a pattern as matching itself: approximate entropy, the older biased form."
            ),
        }
    }

    def process(self, data):
        p = self.params.sample
        measure = antropy.app_entropy if p.approximate else antropy.sample_entropy
        out = np.apply_along_axis(
            measure, -1, np.asarray(data.data, dtype=np.float64), order=p.order, metric=p.metric
        )
        return out.astype(np.float32), data.drop_axis(-1)

← All nodes