numpy-ts 1.2 : parité RNG bit à bit avec NumPy et support Float16 en pur TypeScript

numpy-ts 1.2 : parité RNG bit à bit avec NumPy et support Float16 en pur TypeScript

lschvn

numpy-ts, l'implémentation NumPy la plus complète écrite entièrement en TypeScript, publie sa version 1.2, et le titre n'est pas la vitesse. C'est quelque chose de plus strict : avec la même graine, numpy-ts produit désormais exactement les mêmes nombres aléatoires que NumPy, bit à bit. En parallèle, la release ajoute le support Float16 de première classe et fusionne les points d'entrée par runtime en un seul package qui fonctionne partout.

Le problème que numpy-ts veut résoudre

NumPy est le standard de fait du calcul sur tableaux en Python, algèbre linéaire, traitement du signal, préprocessing pour le machine learning. Amener cette API en TypeScript a un intérêt évident pour les outils web, les notebooks et les applications de données dans le navigateur.

La difficulté n'a jamais été la surface d'API ; c'est de reproduire le comportement de NumPy. numpy-ts aborde le problème en validant directement contre NumPy : plus de 6 000 tests comparent ses sorties avec l'original, sur l'arithmétique, la FFT, l'algèbre linéaire et les distributions aléatoires. La couverture atteint environ 94 % de l'API NumPy, 476 fonctions sur 507, ce qui en fait de loin le portage le plus complet de l'écosystème JavaScript.

L'histoire du RNG : identique, pas similaire

Avant la 1.2, numpy-ts utilisait des approximations de la génération aléatoire de NumPy, suffisant pour un usage occasionnel, mais les séquences divergeaient de NumPy après les premières valeurs. Pour du travail scientifique, c'est disqualifiant : impossible de reproduire l'expérience d'un papier, de porter une fixture de test, ou de vérifier une migration si seed(42) donne des nombres différents.

La version 1.2 réimplémente les générateurs pour correspondre à NumPy bit à bit :

import { random } from 'numpy-ts';

const rng = random.default_rng(42);
rng.random(3);
// [0.7739560485559633, 0.4388784397520523, 0.8585979199113825]
//, exactement les trois nombres que NumPy affiche pour default_rng(42)

Si vous portez un pipeline NumPy et que vos tests vérifient des données aléatoires avec graine, ces fixtures se transfèrent désormais sans modification.

Float16, sans support natif

Float16 (demi-précision) utilise 16 bits par nombre et fait partie du paysage de l'inférence GPU depuis des années, la bande passante mémoire est généralement le goulot d'étranglement, et la demi-précision suffit souvent. JavaScript n'a pas de type float16 natif, donc numpy-ts implémente lui-même la conversion et le stockage, aux côtés de Float32, Float64, des dtypes entiers et des nombres complexes.

Un package, tous les runtimes

Jusqu'ici, chaque runtime demandait son point d'entrée, un import pour Node, un autre pour les navigateurs. La 1.2 les unifie : un package au comportement identique sur Node.js, Bun, Deno et navigateurs, pour environ 93 kB minifié et gzippé, sans aucune dépendance.

Alors, c'est rapide ou pas ?

C'est le point sur lequel il faut être précis : numpy-ts n'est pas proche des performances de NumPy natif, et son auteur ne prétend pas le contraire. NumPy tire sa vitesse de décennies de C, BLAS et LAPACK ; une implémentation en pur TypeScript tourne en moyenne environ 15x plus lentement. La feuille de route vise des optimisations algorithmiques et du WebAssembly ciblé sur les chemins chauds.

En pratique, l'écart compte moins qu'il n'y paraît pour les cas d'usage réels de la bibliothèque, nettoyer un dataset dans un outil navigateur, calculer des statistiques descriptives, faire une petite opération matricielle dans une visualisation. Il compte beaucoup si vous tentez du vrai calcul numérique sur de grands tableaux. Sachez dans quel cas vous êtes.

Compatibilité d'API avec NumPy

L'objectif du projet est la compatibilité d'API, pas seulement les concepts, et le guide de migration montre les traductions côte à côte. La plupart du code se transpose directement :

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 });

Pour commencer

npm install numpy-ts

Aucune dépendance runtime, fonctionne sur Node.js (CommonJS et ESM) et navigateurs modernes. La documentation complète, le guide de migration et la référence d'API sont sur numpyts.dev, avec les sources sur github.com/dupontcyborg/numpy-ts.

Questions fréquentes

Articles connexes

Plus de couverture avec des sujets et tags en commun.

Vite 8.1 Beta : imports `.wasm` directs, `build.chunkImportMap` et rename `server.hmr` → `server.ws`
typescript

Vite 8.1 Beta : imports `.wasm` directs, `build.chunkImportMap` et rename `server.hmr` → `server.ws`

Vite 8.1.0-beta.0 (15 juin 2026) est la première beta de la ligne 8.1. Elle livre le standard WASM ESM Integration en imports `.wasm` directs, une option build.chunkImportMap qui exploite les import maps pour améliorer les taux de cache des chunks, l'intégration avec Vite Task pour du cache de build sans configuration, le support des dépendances de plugin lightningcss, et un breaking rename qui déplace toutes les options `server.hmr` vers `server.ws`.
Oxc v0.135 : le port Rust du React Compiler et un break AST #[non_exhaustive]
typescript

Oxc v0.135 : le port Rust du React Compiler et un break AST #[non_exhaustive]

Oxc 0.135 intègre le port Rust du React Compiler, marque les nœuds AST comme #[non_exhaustive] (breaking change pour les crates Rust en aval), ajoute deux nouvelles méthodes AstBuilder, et apporte de nombreuses corrections de stricte parser et d'espaces en codegen.
Attaque Supply Chain npm : Red Hat Compromis via Mini Shai-Hulud
typescript

Attaque Supply Chain npm : Red Hat Compromis via Mini Shai-Hulud

Wiz Research découvre Miasma, une nouvelle attaque ciblant 32+ paquets npm Red Hat avec du malware voleur de credentials via un abus de trusted-publishing.

Commentaires

Connexion Connectez-vous pour participer à la conversation.

Pas encore de commentaires. Soyez le premier à partager vos pensées.