|
|
|
import numpy as np
|
|
|
|
|
|
def quantize(arr, min_val, max_val, levels, dtype=np.int64):
|
|
"""Quantize an array of (-inf, inf) to [0, levels-1].
|
|
|
|
Args:
|
|
arr (ndarray): Input array.
|
|
min_val (scalar): Minimum value to be clipped.
|
|
max_val (scalar): Maximum value to be clipped.
|
|
levels (int): Quantization levels.
|
|
dtype (np.type): The type of the quantized array.
|
|
|
|
Returns:
|
|
tuple: Quantized array.
|
|
"""
|
|
if not (isinstance(levels, int) and levels > 1):
|
|
raise ValueError(
|
|
f'levels must be a positive integer, but got {levels}')
|
|
if min_val >= max_val:
|
|
raise ValueError(
|
|
f'min_val ({min_val}) must be smaller than max_val ({max_val})')
|
|
|
|
arr = np.clip(arr, min_val, max_val) - min_val
|
|
quantized_arr = np.minimum(
|
|
np.floor(levels * arr / (max_val - min_val)).astype(dtype), levels - 1)
|
|
|
|
return quantized_arr
|
|
|
|
|
|
def dequantize(arr, min_val, max_val, levels, dtype=np.float64):
|
|
"""Dequantize an array.
|
|
|
|
Args:
|
|
arr (ndarray): Input array.
|
|
min_val (scalar): Minimum value to be clipped.
|
|
max_val (scalar): Maximum value to be clipped.
|
|
levels (int): Quantization levels.
|
|
dtype (np.type): The type of the dequantized array.
|
|
|
|
Returns:
|
|
tuple: Dequantized array.
|
|
"""
|
|
if not (isinstance(levels, int) and levels > 1):
|
|
raise ValueError(
|
|
f'levels must be a positive integer, but got {levels}')
|
|
if min_val >= max_val:
|
|
raise ValueError(
|
|
f'min_val ({min_val}) must be smaller than max_val ({max_val})')
|
|
|
|
dequantized_arr = (arr + 0.5).astype(dtype) * (max_val -
|
|
min_val) / levels + min_val
|
|
|
|
return dequantized_arr
|
|
|