numpy-ts 1.2: Bit-genaue NumPy-RNG-Parität und Float16-Support in purem TypeScript

numpy-ts 1.2: Bit-genaue NumPy-RNG-Parität und Float16-Support in purem TypeScript

lschvn

numpy-ts, die vollständigste komplett in TypeScript geschriebene NumPy-Implementierung, hat Version 1.2 veröffentlicht, und die Schlagzeile ist nicht Geschwindigkeit. Sie ist strenger: Mit demselben Seed erzeugt numpy-ts jetzt exakt dieselben Zufallszahlen wie NumPy, Bit für Bit. Daneben bringt das Release vollwertigen Float16-Support und führt die Runtime-spezifischen Entry-Points zu einem Paket zusammen, das überall läuft.

Welches Problem numpy-ts lösen will

Pythons NumPy ist der De-facto-Standard für Array-Computing, lineare Algebra, Signalverarbeitung, Daten-Preprocessing fürs Machine Learning. Diese API nach TypeScript zu bringen, hat offensichtlichen Reiz für Web-Tools, Notebooks und Browser-native Datenanwendungen.

Der schwierige Teil war nie die API-Oberfläche, sondern NumPys Verhalten zu treffen. numpy-ts geht das an, indem es direkt gegen NumPy validiert: Über 6.000 Tests vergleichen die Ausgaben mit dem Original, über Arithmetik, FFT, lineare Algebra und Zufallsverteilungen hinweg. Die Abdeckung liegt bei rund 94 % der NumPy-API, 476 von 507 Funktionen, und macht numpy-ts mit Abstand zum vollständigsten Port im JavaScript-Ökosystem.

Die RNG-Geschichte: identisch, nicht ähnlich

Vor 1.2 nutzte numpy-ts Annäherungen an NumPys Zufallszahlengenerierung, für Gelegenheitsnutzung ausreichend, aber die Folgen wichen nach den ersten Werten von NumPy ab. Für wissenschaftliche Arbeit ist das disqualifizierend: Man kann kein Paper-Experiment reproduzieren, keine Test-Fixture portieren und keine Migration verifizieren, wenn seed(42) andere Zahlen liefert.

Version 1.2 implementiert die Generatoren neu, sodass sie NumPy Bit für Bit entsprechen:

import { random } from 'numpy-ts';

const rng = random.default_rng(42);
rng.random(3);
// [0.7739560485559633, 0.4388784397520523, 0.8585979199113825]
//, exakt die drei Zahlen, die NumPy für default_rng(42) ausgibt

Wer eine NumPy-Pipeline portiert und in Tests auf geseedete Zufallsdaten prüft, kann diese Fixtures jetzt unverändert übernehmen.

Float16, ohne native Unterstützung

Float16 (halbe Präzision) nutzt 16 Bit pro Zahl und gehört seit Jahren zur GPU-Inferenz, Speicherbandbreite ist meist der Engpass, und halbe Präzision reicht oft. JavaScript kennt keinen nativen float16-Typ, also implementiert numpy-ts Konvertierung und Speicherung selbst, neben Float32, Float64, den Integer-dtypes und komplexen Zahlen.

Ein Paket, jede Runtime

Bisher brauchten verschiedene Runtimes verschiedene Entry-Points, ein Import für Node, ein anderer für Browser. Version 1.2 vereinheitlicht das: ein Paket, das sich auf Node.js, Bun, Deno und im Browser identisch verhält, bei rund 93 kB minifiziert und gzipped, ohne Abhängigkeiten.

Und wie schnell ist es ehrlicherweise?

Hier lohnt Präzision: numpy-ts ist nicht annähernd so schnell wie natives NumPy, und sein Autor behauptet das auch nicht. NumPy holt seine Geschwindigkeit aus Jahrzehnten von C, BLAS und LAPACK; eine reine TypeScript-Implementierung läuft im Schnitt etwa 15x langsamer. Die Roadmap zielt auf algorithmische Optimierungen und gezieltes WebAssembly für heiße Pfade.

In der Praxis wiegt die Lücke für die eigentlichen Anwendungsfälle der Bibliothek weniger schwer, als es klingt, ein Dataset in einem Browser-Tool säubern, deskriptive Statistiken berechnen, eine kleine Matrixoperation in einer Visualisierung. Sie wiegt schwer, wenn man echtes numerisches Rechnen auf großen Arrays versucht. Man sollte wissen, in welchem Fall man ist.

API-Kompatibilität mit NumPy

Ziel des Projekts ist API-Kompatibilität, nicht nur die Konzepte, und der Migration Guide zeigt Übersetzungen Seite an Seite. Der meiste Code lässt sich direkt übertragen:

import numpy as np

a = np.array([[1, 2], [3, 4]])
b = np.linalg.inv(a)
c = np.dot(a, b)
d = np.sum(a, axis=0)
import { array, linalg, dot, sum } from 'numpy-ts';

const a = array([[1, 2], [3, 4]]);
const b = linalg.inv(a);
const c = dot(a, b);
const d = sum(a, { axis: 0 });

Loslegen

npm install numpy-ts

Keine Runtime-Abhängigkeiten, läuft auf Node.js (CommonJS und ESM) und in modernen Browsern. Vollständige Dokumentation, Migration Guide und API-Referenz unter numpyts.dev, Quellcode auf github.com/dupontcyborg/numpy-ts.

Häufig gestellte Fragen

Verwandte Artikel

Weitere Berichterstattung zu ähnlichen Themen und Tags.

Vite 8.1 Beta: direkte `.wasm`-Imports, `build.chunkImportMap` und `server.hmr` → `server.ws`-Umbenennung
typescript

Vite 8.1 Beta: direkte `.wasm`-Imports, `build.chunkImportMap` und `server.hmr` → `server.ws`-Umbenennung

Vite 8.1.0-beta.0 (15. Juni 2026) ist die erste Beta der 8.1-Linie. Sie liefert den WASM-ESM-Integration-Standard als direkte .wasm-Imports, eine build.chunkImportMap-Option, die Import Maps nutzt, um Chunk-Cache-Hit-Raten zu verbessern, die Integration mit Vite Task für Zero-Config-Build-Caching, Support für lightningcss-Plugin-Dependencies, und einen Breaking Rename, der alle `server.hmr`-Optionen nach `server.ws` verschiebt.
Oxc v0.135: Rust-Port des React Compiler und ein `#[non_exhaustive]`-AST-Break
typescript

Oxc v0.135: Rust-Port des React Compiler und ein `#[non_exhaustive]`-AST-Break

Oxc 0.135 integriert den Rust-Port des React Compilers, markiert AST-Knoten als #[non_exhaustive] (Breaking Change für nachgelagerte Rust-Crates), fügt zwei neue AstBuilder-Methoden hinzu und liefert zahlreiche Parser-Strenge- und Codegen-Whitespace-Fixes.
npm Supply-Chain-Angriff: Red Hat durch Mini Shai-Hulud Kompromittiert
typescript

npm Supply-Chain-Angriff: Red Hat durch Mini Shai-Hulud Kompromittiert

Wiz Research entdeckt Miasma, einen neuen Supply-Chain-Angriff, der Credential-Diebstahl-Malware in 32+ Red Hat npm-Pakete einschleust.

Kommentare

Anmelden Melden Sie sich an, um an der Diskussion teilzunehmen.

Noch keine Kommentare. Seien Sie der Erste, der seine Gedanken teilt.