moonNum

    NumPy 的 Moonbit 移植 —— 多维数组、线性代数、FFT、随机数

    numpy
    scientific-computing
    array
    Download zip
    Author
    Version
    0.1.0
    License
    Apache-2.0
    Last updated
    2 months ago
    Downloads
    21

    Dependencies

    #moonNum — NumPy for Moonbit

    License Language Tests Coverage

    Multi-dimensional arrays, linear algebra, FFT, random numbers, polynomials, masked arrays, datetime — a complete reimplementation of NumPy 2.x public API surface in Moonbit.

    #Overview

    moonNum is a complete port of NumPy in the Moonbit programming language. It targets full alignment with the NumPy 2.x public API and aims to provide an enterprise-grade scientific computing foundation. The implementation uses Moonbit's official standard libraries (moonbitlang/core, moonbitlang/async, moonbitlang/x) and expresses NumPy semantics in idiomatic Moonbit.

    #Key Features

    • NdArray — NumPy-compatible n-dimensional array backed by a contiguous byte buffer with dtype/shape/strides/offset metadata; supports zero-copy views (transpose / reshape / slice share the same buffer)
    • Full dtype system — Bool / Int8–Int64 / Uint8–Uint64 / Float16–Float64 / Complex64 / Complex128 / Str_ / Datetime64 / TimeDelta64
    • Element-wise ufuncs — add / subtract / multiply / divide / sin / cos / exp / log … 80+ functions with broadcasting
    • Linear algebra — matmul / inv / solve / det / svd / qr / cholesky / eig / lstsq / norm …
    • FFT — fft / ifft / rfft / irfft / fft2 / ifft2 / fftn / ifftn / hfft / ihfft / fftfreq / fftshift …
    • Random numbers — MT19937 bit generator + uniform / normal / exponential / Poisson / binomial / gamma / beta / chi-square / Dirichlet and 30+ more distributions
    • Polynomials — Polynomial / Chebyshev / Legendre / Hermite / HermiteE / Laguerre orthogonal basis classes with PolyBase trait, 2D/3D/ND evaluation, Vandermonde matrices, Gauss nodes, fitting, and root-finding
    • Masked arrays — Full MaskedArray implementation with mask propagation, construction utilities, interval statistics, exception types, mvoid / mr_ indexer
    • Character arrays — String element-wise operations: comparison / concatenation / case / split / replace / translate / classification …
    • Date & time — datetime64 / timedelta64 (ISO 8601 parsing), business-day utilities (is_busday / busday_offset / busday_count / busdaycalendar)
    • IO — .npy / .npz read-write, savez / loadz, in-memory serialization
    • Type system — numpy.typing equivalents (ArrayLike / DTypeLike / NDArray) expressed as traits
    • Matrix library — matrixlib.Matrix class (matrix multiply / inverse / transpose / flatten)

    #Installation

    moonNum is a Moonbit library module. Add it as a dependency in your project's moon.mod.json:

    { "import": { "amor2025/moonNum": { "path": "moonNum", "rev": "..." } } }

    Or via the Moonbit package manager:

    moon add amor2025/moonNum

    #Quick Start

    #Creating Arrays

    import @amor2025/moonNum/src/core
    import @amor2025/moonNum/src/dtypes

    // From a list
    let a = @core.array(
    [Scalar::Int(1L), Scalar::Int(2L), Scalar::Int(3L)],
    [3],
    )

    // Zeros / identity
    let z = @core.zeros([2, 3], dtype=@dtypes.float64)
    let e = @core.eye(3, dtype=@dtypes.float64)

    // Range sequences
    let r = @core.arange_double(start=0.0, stop=1.0, step=0.25) // [0.0, 0.25, 0.5, 0.75]
    let l = @core.linspace(0.0, 1.0, num=5) // [0.0, 0.25, 0.5, 0.75, 1.0]

    #Arithmetic & Broadcasting

    let a = @core.array([Scalar::Float(1.0), Scalar::Float(2.0), Scalar::Float(3.0)], [3])
    let b = @core.array([Scalar::Float(10.0), Scalar::Float(20.0), Scalar::Float(30.0)], [3])

    let c = @core.add(a, b) // [11.0, 22.0, 33.0]
    let d = @core.multiply(a, b) // [10.0, 40.0, 90.0]

    // Broadcasting: scalar + array
    let e = @core.add(a, @core.array([Scalar::Float(100.0)], [1])) // [101.0, 102.0, 103.0]

    #Linear Algebra

    import @amor2025/moonNum/src/linalg

    let m = @core.array(
    [Scalar::Float(1.0), Scalar::Float(2.0),
    Scalar::Float(3.0), Scalar::Float(4.0)],
    [2, 2],
    )

    let inv_m = @linalg.inv(m) // matrix inverse
    let det_m = @linalg.det(m) // determinant
    let matmul_m = @linalg.matmul(m, m) // matrix multiplication

    #FFT

    import @amor2025/moonNum/src/fft

    let signal = @core.array(
    [Scalar::Float(1.0), Scalar::Float(0.0), Scalar::Float(0.0), Scalar::Float(0.0)],
    [4],
    )

    let spectrum = @fft.fft(signal) // forward transform
    let recovered = @fft.ifft(spectrum) // inverse transform

    #Random Numbers

    import @amor2025/moonNum/src/random

    let rng = @random.default_rng() // MT19937 generator
    let uniform_samples = rng.uniform(0.0, 1.0, size=[5]) // 5 uniform [0,1) samples
    let normal_samples = rng.normal(0.0, 1.0, size=[5]) // 5 standard normal samples

    #Polynomials

    import @amor2025/moonNum/src/polynomial

    // Fit with Chebyshev polynomials
    let x = @core.array([Scalar::Float(0.0), Scalar::Float(1.0), Scalar::Float(2.0)], [3])
    let y = @core.array([Scalar::Float(1.0), Scalar::Float(3.0), Scalar::Float(7.0)], [3])
    let p = @polynomial.Chebyshev::fit(x, y, 2) // degree-2 Chebyshev fit

    // Evaluate: call takes an NdArray
    let eval_point = @core.array([Scalar::Float(0.5)], [1])
    let val = p.call(eval_point)

    #Masked Arrays

    import @amor2025/moonNum/src/ma

    let data = @core.array([Scalar::Float(1.0), Scalar::Float(2.0), Scalar::Float(3.0)], [3])
    let mask = @core.array(
    [Scalar::Bool(false), Scalar::Bool(true), Scalar::Bool(false)], [3],
    )
    let masked = @ma.masked_array(data, mask=mask)

    let total = @ma.sum(masked) // 1.0 + 3.0 = 4.0 (skips masked elements)

    #Module Reference

    PackageImport pathDescriptionNumPy equivalent
    coresrc/coreNdArray core, array creation, ufuncs, broadcasting, indexing, reductions, sorting, set opsnumpy.core, numpy
    dtypessrc/dtypesDtype enum, scalar type constants (int8/float64/...), Scalar typenumpy.dtype
    constantssrc/constantsMath & physics constants (e / pi / golden / Avogadro / Boltzmann …)numpy.constants
    exceptionssrc/exceptionsException types (AxisError / ComplexWarning / RankWarning / TooHardError …)numpy.exceptions
    linalgsrc/linalgLinear algebra (matmul / inv / solve / det / svd / qr / cholesky / eig / lstsq)numpy.linalg
    fftsrc/fftFast Fourier Transform (fft / ifft / rfft / irfft / fft2 / ifft2 / fftn / hfft …)numpy.fft
    randomsrc/randomRandom generation (MT19937 + 30+ distributions)numpy.random
    polynomialsrc/polynomialPolynomials (Polynomial / Chebyshev / Legendre / Hermite / HermiteE / Laguerre)numpy.polynomial
    masrc/maMasked arrays (MaskedArray + full utility suite + extras)numpy.ma
    charsrc/charString array ops (compare / concat / case / split / replace …)numpy.char
    iosrc/ioFile IO (.npy / .npz read-write, savez / loadz)numpy.io
    datetimesrc/datetimeDate & time (datetime64 / timedelta64 / business-day utils)numpy.datetime64
    typingsrc/typingType aliases (ArrayLike / DTypeLike / NDArray / NBitBase)numpy.typing
    matrixlibsrc/matrixlibMatrix class (Matrix / asmatrix / bmat)numpy.matrixlib
    libsrc/libNumeric utilities (i0 / interp / window functions / NaN-safe reductions / diff / gradient …)numpy.lib

    #Package Dependency Graph

    dtypes (no deps) constants (no deps) │ │ ├── core ───────────────────┤ │ │ │ │ ├── linalg ───────────┤ │ │ │ │ │ │ ├── polynomial │ │ ├── ma │ │ └── matrixlib │ │ │ │ ├── fft │ │ ├── random │ │ ├── char │ │ ├── io │ │ ├── datetime │ │ ├── typing │ │ └── lib │ │ │ └── exceptions ─────────────┘

    #Differences from NumPy

    moonNum strives for API-level and semantic alignment with NumPy, but the following differences arise from Moonbit language characteristics:

    #Naming Differences

    NumPymoonNumReason
    np.varvariancevar is a Moonbit reserved keyword
    np.prodproductprod conflicts with built-in in some contexts
    np.matrix.Imatrix.iMoonbit uses lowercase method naming convention
    np.matrix.Tmatrix.tSame as above
    np.matrix.A1matrix.a1Same as above
    np.ndarray.dtype (attribute)ndarray.dtype() (method)Moonbit has no Python-style property access

    #Type System Differences

    • No cross-package type aliases: Moonbit does not support cross-package type alias, so numpy.typing.ArrayLike / DTypeLike / NDArray are expressed as traits + conversion functions instead
    • Dtype enum: NumPy's dynamic dtype system is represented as a Dtype enum in Moonbit (Bool / Int8 … / Float64 / Complex128 / Str_ / Datetime64 / TimeDelta64)
    • Scalar type: NumPy scalars are carried as a Scalar enum in Moonbit (Int / Float / Complex / Bool / Str / …)

    #Out of Scope

    The following NumPy modules depend on Python runtime features and are not portable to Moonbit:

    • numpy.f2py (Fortran-to-Python interface generator)
    • numpy.ctypeslib (Python ctypes interop)
    • numpy.matlib (deprecated)
    • numpy.testing (pytest-style assertions; Moonbit has its own assert system)
    • Python reflection/decorator APIs (frompyfunc / add_newdoc / info / NumpyVersion / Arrayterator)
    • Python-side abstract base classes (recarray / record / void / character / flexible / inexact / number / generic)

    #Testing

    moonNum has a comprehensive test suite covering all public APIs:

    # Run all tests moon test # Generate coverage report moon test --enable-coverage moon coverage report -f summary

    Current status:
    • Total tests: 3541
    • Coverage: 91.31% (16959/18574 lines)
    • moon check: 0 errors, 16 warnings

    #Documentation

    Generate API documentation using Moonbit's official tool:

    moon doc --target-dir docs

    Documentation is output to the docs/ directory and includes Chinese API references for all public functions and types.

    #Build

    # Type check moon check # Build moon build # Run tests moon test

    #License

    Apache License 2.0. See LICENSE for details.

    #Acknowledgments

    • NumPy — The original project; all API design and algorithm implementations are based on it
    • Moonbit — The implementation language for this library