@d4c/numjs
Version:
Like NumPy, in TypeScript and JavaScript
763 lines • 55.1 kB
JavaScript
/**
* This is default exported `nj` module page. Below References, Namespaces, Properties, Functions are all exported.
* For example, after import `nj` via `import nj from "@d4c/numjs";` or `const nj = require('@d4c/numjs').default;`,
* you can use `nj.array` to use create a `NdArray`.
*
* @packageDocumentation
*/
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.diag = exports.ifft = exports.fft = exports.fftconvolve = exports.convolve = exports.round = exports.concatenate = exports.dot = exports.arctan = exports.tan = exports.arcsin = exports.sin = exports.arccos = exports.cos = exports.abs = exports.tanh = exports.leakyRelu = exports.clip = exports.sigmoid = exports.softmax = exports.random = exports.empty = exports.ones = exports.zeros = exports.arange = exports.negative = exports.transpose = exports.mod = exports.max = exports.min = exports.std = exports.mean = exports.sum = exports.power = exports.sqrt = exports.log = exports.exp = exports.reshape = exports.flatten = exports.equal = exports.subtract = exports.divide = exports.multiply = exports.add = exports.broadcast = exports.errors = exports.NdArray = exports.ndarray = exports.dtypes = exports.config = void 0;
exports.uint8Clamped = exports.float64 = exports.float32 = exports.uint32 = exports.int32 = exports.uint16 = exports.int16 = exports.uint8 = exports.int8 = exports.remainder = exports.array = exports.rot90 = exports.flip = exports.stack = exports.identity = void 0;
const cwise_1 = __importDefault(require("cwise"));
const ndarray_ops_1 = __importDefault(require("ndarray-ops"));
const ndarray_fft_1 = __importDefault(require("ndarray-fft"));
var config_1 = require("./config");
Object.defineProperty(exports, "config", { enumerable: true, get: function () { return __importDefault(config_1).default; } });
var dtypes_1 = require("./dtypes");
Object.defineProperty(exports, "dtypes", { enumerable: true, get: function () { return __importDefault(dtypes_1).default; } });
var ndarray_1 = require("ndarray");
Object.defineProperty(exports, "ndarray", { enumerable: true, get: function () { return __importDefault(ndarray_1).default; } });
const ndarray_2 = require("./ndarray");
Object.defineProperty(exports, "NdArray", { enumerable: true, get: function () { return ndarray_2.NdArray; } });
const errors = __importStar(require("./errors"));
exports.errors = errors;
const utils_1 = __importDefault(require("./utils"));
function broadcast(shape1, shape2) {
if (shape1.length === 0 || shape2.length === 0) {
return;
}
const reversed1 = shape1.slice().reverse();
const reversed2 = shape2.slice().reverse();
const maxLength = Math.max(shape1.length, shape2.length);
const outShape = new Array(maxLength);
for (let i = 0; i < maxLength; i++) {
if (!reversed1[i] || reversed1[i] === 1) {
outShape[i] = reversed2[i];
}
else if (!reversed2[i] || reversed2[i] === 1) {
outShape[i] = reversed1[i];
}
else if (reversed1[i] === reversed2[i]) {
outShape[i] = reversed1[i];
}
else {
return;
}
}
return outShape.reverse();
}
exports.broadcast = broadcast;
/**
* Add arguments, element-wise.
*/
function add(a, b) {
return ndarray_2.NdArray.new(a).add(b);
}
exports.add = add;
/**
* Multiply arguments, element-wise.
*/
function multiply(a, b) {
return ndarray_2.NdArray.new(a).multiply(b);
}
exports.multiply = multiply;
/**
* Divide `a` by `b`, element-wise.
*/
function divide(a, b) {
return ndarray_2.NdArray.new(a).divide(b);
}
exports.divide = divide;
/**
* Subtract second argument from the first, element-wise.
*/
function subtract(a, b) {
return ndarray_2.NdArray.new(a).subtract(b);
}
exports.subtract = subtract;
/**
* Return true if two arrays have the same shape and elements, false otherwise.
*/
function equal(array1, array2) {
return ndarray_2.NdArray.new(array1).equal(array2);
}
exports.equal = equal;
/**
* Return a copy of the array collapsed into one dimension using row-major order (C-style)
*/
function flatten(array) {
return ndarray_2.NdArray.new(array).flatten();
}
exports.flatten = flatten;
/**
* Gives a new shape to an array without changing its data.
* @param array
* @param shape - The new shape should be compatible with the original shape. If an integer, then the result will be a 1-D array of that length
*/
function reshape(array, shape) {
// TypeScript is not smart enought on parameters detection on overloading
// workaround way
if (typeof shape == "number") {
return ndarray_2.NdArray.new(array).reshape(shape);
}
else {
return ndarray_2.NdArray.new(array).reshape(shape);
}
}
exports.reshape = reshape;
/**
* Calculate the exponential of all elements in the input array, element-wise.
*/
function exp(x) {
return ndarray_2.NdArray.new(x).exp();
}
exports.exp = exp;
/**
* Calculate the natural logarithm of all elements in the input array, element-wise.
*/
function log(x) {
return ndarray_2.NdArray.new(x).log();
}
exports.log = log;
/**
* Calculate the positive square-root of all elements in the input array, element-wise.
*/
function sqrt(x) {
return ndarray_2.NdArray.new(x).sqrt();
}
exports.sqrt = sqrt;
/**
* Raise first array elements to powers from second array, element-wise.
*/
function power(x1, x2) {
return ndarray_2.NdArray.new(x1).pow(x2);
}
exports.power = power;
/**
* Return the sum of input array elements.
*/
function sum(x) {
return ndarray_2.NdArray.new(x).sum();
}
exports.sum = sum;
/**
* Return the arithmetic mean of input array elements.
*/
function mean(x) {
return ndarray_2.NdArray.new(x).mean();
}
exports.mean = mean;
/**
* Returns the standard deviation, a measure of the spread of a distribution, of the input array elements.
*/
function std(x, options) {
return ndarray_2.NdArray.new(x).std(options);
}
exports.std = std;
/**
* Return the minimum value of the array
*/
function min(x) {
return ndarray_2.NdArray.new(x).min();
}
exports.min = min;
/**
* Return the maximum value of the array
*/
function max(x) {
return ndarray_2.NdArray.new(x).max();
}
exports.max = max;
/**
* Return element-wise remainder of division.
* Computes the remainder complementary to the `floor` function. It is equivalent to the Javascript modulus operator``x1 % x2`` and has the same sign as the divisor x2.
*/
function mod(x1, x2) {
return ndarray_2.NdArray.new(x1).mod(x2);
}
exports.mod = mod;
/**
* Permute the dimensions of the input array according to the given axes.
*/
function transpose(x, axes) {
return ndarray_2.NdArray.new(x).transpose(axes);
}
exports.transpose = transpose;
/**
* Return the inverse of the input array, element-wise.
*/
function negative(x) {
return ndarray_2.NdArray.new(x).negative();
}
exports.negative = negative;
function arange(...args) {
if (arguments.length === 1) {
return arange(0, arguments[0], 1, undefined);
}
else if (arguments.length === 2 && utils_1.default.isNumber(arguments[1])) {
return arange(arguments[0], arguments[1], 1, undefined);
}
else if (arguments.length === 2) {
return arange(0, arguments[0], 1, arguments[1]);
}
else if (arguments.length === 3 && !utils_1.default.isNumber(arguments[2])) {
return arange(arguments[0], arguments[1], 1, arguments[2]);
}
let start = arguments[0];
const stop = arguments[1];
const step = arguments[2];
const dtype = arguments[3];
const result = [];
let i = 0;
while (start < stop) {
result[i++] = start;
start += step;
}
return ndarray_2.NdArray.new(result, dtype);
}
exports.arange = arange;
/**
* Return a new array of given shape and type, filled with zeros.
*
* @param shape - Shape of the new array, e.g., [2, 3] or 2.
* @param dtype Defaut is "array". The type of the output array. E.g., 'uint8' or Uint8Array.
*
*/
function zeros(shape, dtype) {
if (utils_1.default.isNumber(shape) && shape >= 0) {
shape = [shape];
}
const s = utils_1.default.shapeSize(shape);
const T = utils_1.default.getType(dtype);
const arr = new ndarray_2.NdArray(new T(s), shape);
if (arr.dtype === "array") {
ndarray_ops_1.default.assigns(arr.selection, 0);
}
return arr;
}
exports.zeros = zeros;
/**
* Return a new array of given shape and type, filled with ones.
*
* @param shape - Shape of the new array, e.g., [2, 3] or 2.
* @param dtype - Defaut is "array". The type of the output array. E.g., 'uint8' or Uint8Array.
*
* @return Array of ones with the given shape and dtype
*/
function ones(shape, dtype) {
if (utils_1.default.isNumber(shape) && shape >= 0) {
shape = [shape];
}
const s = utils_1.default.shapeSize(shape);
const T = utils_1.default.getType(dtype);
const arr = new ndarray_2.NdArray(new T(s), shape);
ndarray_ops_1.default.assigns(arr.selection, 1);
return arr;
}
exports.ones = ones;
/**
* Return a new array of given shape and type, filled with `undefined` values.
*
* @param shape - Shape of the new array, e.g., [2, 3] or 2.
* @param dtype - Defaut is "array". The type of the output array. E.g., 'uint8' or Uint8Array.
*
* @return Array of `undefined` values with the given shape and dtype
*/
function empty(shape, dtype) {
if (utils_1.default.isNumber(shape) && shape >= 0) {
shape = [shape];
}
const s = utils_1.default.shapeSize(shape);
const T = utils_1.default.getType(dtype);
return new ndarray_2.NdArray(new T(s), shape);
}
exports.empty = empty;
function random(...args) {
let shape;
if (arguments.length === 0) {
return ndarray_2.NdArray.new(Math.random());
}
else if (arguments.length === 1) {
shape = utils_1.default.isNumber(args[0]) ? [args[0] | 0] : args[0];
}
else {
shape = [].slice.call(arguments);
}
const s = utils_1.default.shapeSize(shape);
const arr = new ndarray_2.NdArray(new Float64Array(s), shape);
ndarray_ops_1.default.random(arr.selection);
return arr;
}
exports.random = random;
/**
* Return the softmax, or normalized exponential, of the input array, element-wise.
*/
function softmax(x) {
const e = ndarray_2.NdArray.new(x).exp();
const se = e.sum(); // scalar
ndarray_ops_1.default.divseq(e.selection, se);
return e;
}
exports.softmax = softmax;
/* istanbul ignore next */
const doSigmoid = (0, cwise_1.default)({
args: ["array", "scalar"],
body: function sigmoidCwise(a, t) {
a = a < -30 ? 0 : a > 30 ? 1 : 1 / (1 + Math.exp(-1 * t * a));
},
});
/**
* Return the sigmoid of the input array, element-wise.
* @param x
* @param t - stifness parameter
*/
function sigmoid(x, t = 1) {
x = ndarray_2.NdArray.new(x).clone();
t = t || 1;
doSigmoid(x.selection, t);
return x;
}
exports.sigmoid = sigmoid;
/* istanbul ignore next */
const doClip = (0, cwise_1.default)({
args: ["array", "scalar", "scalar"],
body: function clipCwise(a, min, max) {
a = Math.min(Math.max(min, a), max);
},
});
/**
* Clip (limit) the values in an array between min and max, element-wise.
*/
function clip(x, min = 0, max = 1) {
if (arguments.length === 1) {
min = 0;
max = 1;
}
else if (arguments.length === 2) {
max = 1;
}
const s = x instanceof ndarray_2.NdArray ? x.clone() : ndarray_2.NdArray.new(x);
doClip(s.selection, min, max);
return s;
}
exports.clip = clip;
const doLeakyRelu = (0, cwise_1.default)({
args: ["array", "scalar"],
body: function leakyReluCwise(xi, alpha) {
xi = Math.max(alpha * xi, xi);
},
});
function leakyRelu(x, alpha) {
alpha = alpha || 1e-3;
const s = x instanceof ndarray_2.NdArray ? x.clone() : ndarray_2.NdArray.new(x);
doLeakyRelu(s.selection, alpha);
return s;
}
exports.leakyRelu = leakyRelu;
/* istanbul ignore next */
const doTanh = (0, cwise_1.default)({
args: ["array"],
body: function tanhCwise(xi) {
xi = (Math.exp(2 * xi) - 1) / (Math.exp(2 * xi) + 1);
},
});
/**
* Return hyperbolic tangent of the input array, element-wise.
*/
function tanh(x) {
const s = x instanceof ndarray_2.NdArray ? x.clone() : ndarray_2.NdArray.new(x);
doTanh(s.selection);
return s;
}
exports.tanh = tanh;
/**
* Return absolute value of the input array, element-wise.
*/
function abs(x) {
const s = x instanceof ndarray_2.NdArray ? x.clone() : ndarray_2.NdArray.new(x);
ndarray_ops_1.default.abseq(s.selection);
return s;
}
exports.abs = abs;
/**
* Return trigonometric cosine of the input array, element-wise.
*/
function cos(x) {
const s = x instanceof ndarray_2.NdArray ? x.clone() : ndarray_2.NdArray.new(x);
ndarray_ops_1.default.coseq(s.selection);
return s;
}
exports.cos = cos;
/**
* Return trigonometric inverse cosine of the input array, element-wise.
*/
function arccos(x) {
const s = x instanceof ndarray_2.NdArray ? x.clone() : ndarray_2.NdArray.new(x);
ndarray_ops_1.default.acoseq(s.selection);
return s;
}
exports.arccos = arccos;
/**
* Return trigonometric sine of the input array, element-wise.
*/
function sin(x) {
const s = x instanceof ndarray_2.NdArray ? x.clone() : ndarray_2.NdArray.new(x);
ndarray_ops_1.default.sineq(s.selection);
return s;
}
exports.sin = sin;
/**
* Return trigonometric inverse sine of the input array, element-wise.
*/
function arcsin(x) {
const s = x instanceof ndarray_2.NdArray ? x.clone() : ndarray_2.NdArray.new(x);
ndarray_ops_1.default.asineq(s.selection);
return s;
}
exports.arcsin = arcsin;
/**
* Return trigonometric tangent of the input array, element-wise.
*/
function tan(x) {
const s = x instanceof ndarray_2.NdArray ? x.clone() : ndarray_2.NdArray.new(x);
ndarray_ops_1.default.taneq(s.selection);
return s;
}
exports.tan = tan;
/**
* Return trigonometric inverse tangent of the input array, element-wise.
*/
function arctan(x) {
const s = x instanceof ndarray_2.NdArray ? x.clone() : ndarray_2.NdArray.new(x);
ndarray_ops_1.default.ataneq(s.selection);
return s;
}
exports.arctan = arctan;
/**
* Dot product of two arrays.
*
* WARNING: supported products are:
* - matrix dot matrix
* - vector dot vector
* - matrix dot vector
* - vector dot matrix
*/
function dot(a, b) {
return ndarray_2.NdArray.new(a).dot(b);
}
exports.dot = dot;
function concatenate(...args) {
let arrays;
if (args.length > 1) {
arrays = [].slice.call(args);
}
else {
arrays = args[0];
}
let i, a;
for (i = 0; i < arrays.length; i++) {
a = arrays[i];
arrays[i] = a instanceof ndarray_2.NdArray ? a.tolist() : utils_1.default.isNumber(a) ? [a] : a;
}
let m = arrays[0];
for (i = 1; i < arrays.length; i++) {
a = arrays[i];
const mShape = utils_1.default.getShape(m);
const aShape = utils_1.default.getShape(a);
if (mShape.length !== aShape.length) {
throw new errors.ValueError("all the input arrays must have same number of dimensions");
}
else if (mShape.length === 1 && aShape.length === 1) {
m = m.concat(a);
}
else if ((mShape.length === 2 && aShape.length === 2 && mShape[0] === aShape[0]) ||
(mShape.length === 1 && aShape.length === 2 && mShape[0] === aShape[0]) ||
(mShape.length === 2 && aShape.length === 1 && mShape[0] === aShape[0])) {
for (let row = 0; row < mShape[0]; row++) {
m[row] = m[row].concat(a[row]);
}
}
else if ((mShape.length === 3 &&
aShape.length === 3 &&
mShape[0] === aShape[0] &&
mShape[1] === aShape[1]) ||
(mShape.length === 2 &&
aShape.length === 3 &&
mShape[0] === aShape[0] &&
mShape[1] === aShape[1]) ||
(mShape.length === 3 &&
aShape.length === 2 &&
mShape[0] === aShape[0] &&
mShape[1] === aShape[1])) {
for (let rowI = 0; rowI < mShape[0]; rowI++) {
const rowV = new Array(mShape[1]);
for (let colI = 0; colI < mShape[1]; colI++) {
rowV[colI] = m[rowI][colI].concat(a[rowI][colI]);
}
m[rowI] = rowV;
}
}
else {
throw new errors.ValueError('cannot concatenate "' + mShape + '" with "' + aShape + '"');
}
}
return ndarray_2.NdArray.new(m, arrays[0].dtype);
}
exports.concatenate = concatenate;
/**
* Round an array to the to the nearest integer.
*/
function round(x) {
return ndarray_2.NdArray.new(x).round();
}
exports.round = round;
/**
* Convolve 2 N-dimensionnal arrays
*
* @note: Arrays must have the same dimensions and a must be greater than b.
* @note: The convolution product is only given for points where the signals overlap completely. Values outside the signal boundary have no effect. This behaviour is known as the 'valid' mode.
*/
function convolve(a, b) {
return ndarray_2.NdArray.new(a).convolve(b);
}
exports.convolve = convolve;
/**
* Convolve 2 N-dimensionnal arrays using Fast Fourier Transform (FFT)
*
* @note: Arrays must have the same dimensions and a must be greater than b.
* @note: The convolution product is only given for points where the signals overlap completely. Values outside the signal boundary have no effect. This behaviour is known as the 'valid' mode.
*/
function fftconvolve(a, b) {
return ndarray_2.NdArray.new(a).fftconvolve(b);
}
exports.fftconvolve = fftconvolve;
function fft(x) {
x = x instanceof ndarray_2.NdArray ? x.clone() : ndarray_2.NdArray.new(x);
const xShape = x.shape;
const d = xShape.length;
if (xShape[d - 1] !== 2) {
throw new errors.ValueError("expect last dimension of the array to have 2 values (for both real and imaginary part)");
}
let rPicker = new Array(d);
let iPicker = new Array(d);
rPicker[d - 1] = 0;
iPicker[d - 1] = 1;
(0, ndarray_fft_1.default)(1, x.selection.pick.apply(x.selection, rPicker), x.selection.pick.apply(x.selection, iPicker));
return x;
}
exports.fft = fft;
function ifft(x) {
x = x instanceof ndarray_2.NdArray ? x.clone() : ndarray_2.NdArray.new(x);
const xShape = x.shape;
const d = xShape.length;
if (xShape[d - 1] !== 2) {
throw new errors.ValueError("expect last dimension of the array to have 2 values (for both real and imaginary part)");
}
let rPicker = new Array(d);
let iPicker = new Array(d);
rPicker[d - 1] = 0;
iPicker[d - 1] = 1;
(0, ndarray_fft_1.default)(-1, x.selection.pick.apply(x.selection, rPicker), x.selection.pick.apply(x.selection, iPicker));
return x;
}
exports.ifft = ifft;
/**
* Extract a diagonal or construct a diagonal array.
* @returns a view a of the original array when possible, a new array otherwise
*/
function diag(x) {
return ndarray_2.NdArray.new(x).diag();
}
exports.diag = diag;
/**
* The identity array is a square array with ones on the main diagonal.
* @param n number of rows (and columns) in n x n output.
* @param dtype Defaut is "array". The type of the output array. E.g., 'uint8' or Uint8Array.
* @return n x n array with its main diagonal set to one, and all other elements 0
*/
function identity(n, dtype) {
const arr = zeros([n, n], dtype);
for (let i = 0; i < n; i++)
arr.set(i, i, 1);
return arr;
}
exports.identity = identity;
/**
* Join a sequence of arrays along a new axis.
* The axis parameter specifies the index of the new axis in the dimensions of the result.
* For example, if axis=0 it will be the first dimension and if axis=-1 it will be the last dimension.
* @param arrays Sequence of array_like
* @param axis The axis in the result array along which the input arrays are stacked.
* @return The stacked array has one more dimension than the input arrays.
*/
function stack(arrays, axis = 0) {
axis = axis || 0;
if (!arrays || arrays.length === 0) {
throw new errors.ValueError("need at least one array to stack");
}
const arrays2 = arrays.map(function (a) {
return (utils_1.default.isNumber(a) ? a : ndarray_2.NdArray.new(a));
});
const expectedShape = arrays2[0].shape || []; // for numbers
for (let i = 1; i < arrays2.length; i++) {
const shape = arrays2[i].shape || []; // for numbers
const len = Math.max(expectedShape.length, shape.length);
for (let j = 0; j < len; j++) {
if (expectedShape[j] !== shape[j])
throw new errors.ValueError("all input arrays must have the same shape");
}
}
let stacked;
if (expectedShape.length === 0) {
// stacking numbers
stacked = concatenate(arrays2);
}
else {
stacked = zeros([arrays2.length].concat(expectedShape));
for (let i = 0; i < arrays2.length; i++) {
stacked.pick(i).assign(arrays2[i], false);
}
}
if (axis) {
// recompute neg axis
if (axis < 0)
axis = stacked.ndim + axis;
const d = stacked.ndim;
const axes = new Array(d);
for (let i = 0; i < d; i++) {
axes[i] = i < axis ? i + 1 : i === axis ? 0 : i;
}
return stacked.transpose(axes);
}
return stacked;
}
exports.stack = stack;
/**
* Reverse the order of elements in an array along the given axis.
* The shape of the array is preserved, but the elements are reordered.
* New in version 0.15.0.
* @param m Input array.
* @param axis Axis in array, which entries are reversed.
* @return A view of `m` with the entries of axis reversed. Since a view is returned, this operation is done in constant time.
*/
function flip(m, axis) {
m = ndarray_2.NdArray.new(m);
const indexer = ones(m.ndim).tolist();
let cleanaxis = axis;
while (cleanaxis < 0) {
cleanaxis += m.ndim;
}
if (indexer[cleanaxis] === undefined) {
throw new errors.ValueError("axis=" + axis + "invalid for the " + m.ndim + "-dimensional input array");
}
indexer[cleanaxis] = -1;
return m.step.apply(m, indexer);
}
exports.flip = flip;
/**
* Rotate an array by 90 degrees in the plane specified by axes.
* Rotation direction is from the first towards the second axis.
* New in version 0.15.0.
* @param m array_like
* @param k Number of times the array is rotated by 90 degrees.
* @param axes Default [0, 1]. The array is rotated in the plane defined by the axes. Axes must be different.
* @return A rotated view of m.
*/
function rot90(m, k = 1, axes = [0, 1]) {
k = k || 1;
while (k < 0) {
k += 4;
}
k = k % 4;
m = ndarray_2.NdArray.new(m);
let axes2 = ndarray_2.NdArray.new(axes || [0, 1]);
if (axes2.shape.length !== 1 || axes2.shape[0] !== 2) {
throw new errors.ValueError("len(axes) must be 2");
}
axes2 = axes2.tolist();
if (axes2[0] === axes2[1] || abs(axes2[0] - axes2[1]).ndim === m.ndim) {
throw new errors.ValueError("Axes must be different.");
}
if (k === 0) {
return m;
}
if (k === 2) {
return flip(flip(m, axes2[0]), axes2[1]);
}
const axesList = arange(m.ndim).tolist();
const keep = axesList[axes2[0]];
axesList[axes2[0]] = axesList[axes2[1]];
axesList[axes2[1]] = keep;
if (k === 1) {
return transpose(flip(m, axes2[1]), axesList);
}
else {
return flip(transpose(m, axesList), axes2[1]);
}
}
exports.rot90 = rot90;
/**
* @param dtype Defaut is "array". The type of the output array. E.g., 'uint8' or Uint8Array.
*/
exports.array = ndarray_2.NdArray.new;
exports.remainder = mod;
function int8(array) {
return ndarray_2.NdArray.new(array, "int8");
}
exports.int8 = int8;
function uint8(array) {
return ndarray_2.NdArray.new(array, "uint8");
}
exports.uint8 = uint8;
function int16(array) {
return ndarray_2.NdArray.new(array, "int16");
}
exports.int16 = int16;
function uint16(array) {
return ndarray_2.NdArray.new(array, "uint16");
}
exports.uint16 = uint16;
function int32(array) {
return ndarray_2.NdArray.new(array, "int32");
}
exports.int32 = int32;
function uint32(array) {
return ndarray_2.NdArray.new(array, "uint32");
}
exports.uint32 = uint32;
function float32(array) {
return ndarray_2.NdArray.new(array, "float32");
}
exports.float32 = float32;
function float64(array) {
return ndarray_2.NdArray.new(array, "float64");
}
exports.float64 = float64;
function uint8Clamped(array) {
return ndarray_2.NdArray.new(array, "uint8_clamped");
}
exports.uint8Clamped = uint8Clamped;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUNILFlBQVksQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFYixrREFBMEI7QUFDMUIsOERBQThCO0FBQzlCLDhEQUFnQztBQUVoQyxtQ0FBNkM7QUFBcEMsaUhBQUEsT0FBTyxPQUFVO0FBQzFCLG1DQUE2QztBQUFwQyxpSEFBQSxPQUFPLE9BQVU7QUFDMUIsbUNBQTZDO0FBQXBDLG1IQUFBLE9BQU8sT0FBVztBQUMzQix1Q0FLbUI7QUFDVix3RkFMUCxpQkFBTyxPQUtPO0FBQ2hCLGlEQUFtQztBQUMxQix3QkFBTTtBQUVmLG9EQUF3QjtBQUV4QixTQUFnQixTQUFTLENBQUMsTUFBZ0IsRUFBRSxNQUFnQjtJQUMxRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQzlDLE9BQU87S0FDUjtJQUNELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMzQyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6RCxNQUFNLFFBQVEsR0FBYSxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNoRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ2xDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFL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RyxDQUFDLFlBQVksaUJBQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxpQkFBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RCxxQkFBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdkIsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBSkQsa0JBSUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLEdBQUcsQ0FBQyxDQUFvQztJQUN0RCxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksaUJBQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxpQkFBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RCxxQkFBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdkIsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBSkQsa0JBSUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLE1BQU0sQ0FBQyxDQUFvQztJQUN6RCxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksaUJBQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxpQkFBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RCxxQkFBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDeEIsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBSkQsd0JBSUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLEdBQUcsQ0FBQyxDQUFvQztJQUN0RCxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksaUJBQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxpQkFBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RCxxQkFBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdkIsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBSkQsa0JBSUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLE1BQU0sQ0FBQyxDQUFvQztJQUN6RCxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksaUJBQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxpQkFBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RCxxQkFBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDeEIsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBSkQsd0JBSUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLEdBQUcsQ0FBQyxDQUFvQztJQUN0RCxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksaUJBQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxpQkFBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RCxxQkFBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdkIsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBSkQsa0JBSUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLE1BQU0sQ0FBQyxDQUFvQztJQUN6RCxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksaUJBQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxpQkFBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RCxxQkFBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDeEIsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBSkQsd0JBSUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLEdBQUcsQ0FDakIsQ0FBMkIsRUFDM0IsQ0FBMkI7SUFFM0IsT0FBTyxpQkFB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