Skip to main content
numpy-ts gives you two choices for how to import it. The right choice depends on whether you care more about developer experience or bundle size.

The full library (numpy-ts)

This is the default and the easiest way to use numpy-ts. It gives you NDArray objects that support method chaining — the same fluent style you are used to from NumPy:
Every standalone function (np.add, np.reshape, np.sum, etc.) is also available as a method on the array itself (.add(), .reshape(), .sum()). This makes code shorter and more readable. The trade-off: importing anything from numpy-ts pulls the entire library into your bundle (~200-300 KB minified). The bundler cannot tree-shake it because all 100+ methods are attached to the NDArray class at import time.
~200-300 KB is still small compared to alternatives that ship WebAssembly or native modules. For Node.js servers, scripts, and most applications this is perfectly fine.
Use the full library when:
  • You are building an application (not a library)
  • You are running on Node.js or Bun where bundle size is irrelevant
  • You want the best developer experience with method chaining
  • You are using many functions from across the API

The tree-shakeable core (numpy-ts/core)

The core entry point returns NDArrayCore objects — a minimal array class with properties (shape, dtype, ndim, data, T, etc.) but no operation methods. Instead, you use standalone functions for everything:
Your bundler (Vite, webpack, esbuild, Rollup) analyzes which functions you actually imported and excludes everything else. The result: your bundle only contains what you use. How much does this save? Use the core entry point when:
  • You are building a browser app where every kilobyte matters
  • You are publishing a library on npm (let your consumers choose their bundle)
  • You only need a small subset of numpy-ts functions

What about Node.js file I/O?

There is a third entry point, numpy-ts/node, that adds file system operations (load, save, savez, loadtxt, savetxt) on top of the full library. It behaves like numpy-ts but also includes Node.js fs bindings.
numpy-ts/node only works in Node.js and Bun. It will not work in browsers. For browser-based I/O, use parseNpy / serializeNpy from either numpy-ts or numpy-ts/core.

NDArray vs NDArrayCore

The two array types share the same core — NDArray extends NDArrayCore. This means:
  • Every NDArray is an NDArrayCore (you can pass it to any function that accepts NDArrayCore)
  • NDArrayCore is not an NDArray (it lacks the chaining methods)
  • Both types expose the same properties: shape, ndim, size, dtype, data, strides, flags, base, T, itemsize, nbytes
Standalone functions from numpy-ts/core accept both types as input:
If you are writing a library that depends on numpy-ts, accept NDArrayCore in your public API. This lets your consumers use either entry point.

Side-by-side comparison

The same operation written with both entry points:
Both produce identical results. The difference is only in style and bundle size.

Quick reference