File: __init__.py

package info (click to toggle)
numpy-minmax 0.5.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 180 kB
  • sloc: python: 394; ansic: 250; makefile: 6
file content (36 lines) | stat: -rw-r--r-- 1,353 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from typing import Tuple

import _numpy_minmax
import numpy as np
from numpy.typing import NDArray

try:
    from ._version import version as __version__
except ImportError:
    __version__ = "unknown"


def minmax(a: NDArray) -> Tuple:
    if 0 in a.shape:
        raise ValueError("Cannot find min/max value in empty array")
    if a.dtype == np.dtype("float32"):
        if a.flags["C_CONTIGUOUS"] or a.flags["F_CONTIGUOUS"]:
            result = _numpy_minmax.lib.minmax_contiguous_float32(
                _numpy_minmax.ffi.cast("float *", a.ctypes.data), a.size
            )
            return np.float32(result.min_val), np.float32(result.max_val)
        if a.ndim == 1:
            result = _numpy_minmax.lib.minmax_1d_strided_float32(
                _numpy_minmax.ffi.cast("float *", a.ctypes.data), a.size, a.strides[0]
            )
            return np.float32(result.min_val), np.float32(result.max_val)
        # TODO: Find multi-dim arrays that can be simplified to a single stride
    elif a.dtype == np.dtype("int16") and (
        a.flags["C_CONTIGUOUS"] or a.flags["F_CONTIGUOUS"]
    ):
        result = _numpy_minmax.lib.minmax_contiguous_int16(
            _numpy_minmax.ffi.cast("int16_t *", a.ctypes.data), a.size
        )
        return np.int16(result.min_val), np.int16(result.max_val)

    return np.amin(a), np.amax(a)