@d4c/numjs

中文文档
0.17.35发布于 2026/03/07MITTypeScriptESM + CJS近 30 天下载 2492

像 NumPy, 在 TypeScript 和 JavaScript 中

中文使用文档
文档目录20 节
  1. 特征
  2. 安装
  3. 基本情况
  4. 矩阵创建
  5. 关于阵列的更多信息
  6. 打印阵列
  7. 索引编制
  8. 切开和切开
  9. 基本业务
  10. 通用函数
  11. 形状操纵
  12. 身份矩阵
  13. 连接不同的数组
  14. 堆叠多个数组
  15. 深层复制
  16. 快速傅里叶变形 (FFT)
  17. 进取
  18. 其他倾斜
  19. 贡献者
  20. 文档

@d4c/numjs (韩语)

npm version example workflow

维持状况: 这个项目在 被动维修 模式 —— 关键bug修正和小改进可能被接受,但没有计划活动特性开发.

这么说, @d4c/numjs 现为a 稳定、随时使用 类似 NumPy 的库,在框外有 TypeScript 的打字功能——如果你需要基本的 ndarray 操作而不处理不稳定的 API 或陡峭的学习曲线,它仍然很有效.

关于更全面的替代办法,考虑:

  • 数字 ——旨在以纯类型脚本覆盖NumPy94%的API(仍处于早期/不稳定阶段)
  • @stdlib/ndaray (英语) ——成熟而严谨,但具有不同的API风格

数字Js 建在顶部 无线 并使用许多 scijs 软件包。 。 。 . ndarray 导出为 nj.ndarray,以及任意 NdArray 实例的财产 selection 是一个 ndarray 对象.

此项目修改自 https://github.com/nicolaspanel/numjs (中文(简体) ) 并在修改后进行

  • 删除图像操作的特性,其依赖性可能导致Mac M1 ARM机上的某些安装故障. 你可以考虑 ndarray- 像素 如果您需要这个功能.
  • 添加类型脚本打字和 .d.ts 已退出框, JavaScript 也被支持。 而且,它包括
    • ES6构建(ES-2015),为主建包. json.
    • ES6构建(ES2015),为模块构建提供ES6模块. 一些工具会跟随包.json中的模块字段,如Rollup,Webpack,或Parcel.
  • 通过ES6语法重构内部代码,不改变核心算法代码.
  • 添加"uint8 clamped"(Uint8ClampedArray)支持.
  • 其他改进.

你可以检查 更改日志。 。 。 .

特征

数字Js 是一个 npm 软件包,用于使用 JavaScript 进行科学计算。 其中包括:

  • 一个强大的 N-维阵列对象, NdArray
  • 线性代数函数
  • 快速傅里叶变换

除了其明显的科学用途外, 数字Js 也可以用作通用数据的高效多维容器.

它在节点.js和浏览器中都有效.

数字Js 已根据该条例获得许可证 麻省理工学院许可证,使再利用几乎不受限制.

试试这个 小说 和图书馆一起玩.

安装

npm install @d4c/numjs 
# or 
yarn add @d4c/numjs

然后使用ES6导入:

import nj from "@d4c/numjs"; 

或共同JS要求:

// TypeScript users will not get typings when using require
const nj = require('@d4c/numjs').default; 

或者从CDN下载:

<script type="module">
    import nj from 'https://cdn.jsdelivr.net/npm/@d4c/numjs/build/module/numjs.min.js';
    // optional: assign to global to let other code can use: globalThis.nj = nj;
</script>

如果使用 ES6 import 或者说 CommonJS require 在错误中恢复, 请尝试使用 import nj from "@d4c/numjs/build/module/numjs.min.js 在你的环境中.

基本情况

矩阵创建

> const a = nj.array([2,3,4]);
> a
array([ 2, 3, 4])
> const b = nj.array([[1,2,3], [4,5,6]]);
> b
array([[ 1, 2, 3],
       [ 4, 5, 6]])

说明: 默认数据容器是 JavaScript Array 对象。 如果需要,您也可以使用键入数组,例如 Uint8Array数字 :

> const a = nj.uint8([1,2,3]);
> a
array([ 1, 2, 3], dtype=uint8)

下面是创建相同的 NdArray。 。 。 .

const a = nj.array([1, 2, 3], "uint8");
const b = nj.array([1, 2, 3], Uint8Array);
const c = nj.array(new Uint8Array([1, 2, 3]));
const d = nj.arange(3,"uint8"); // results in array([ 0, 1, 2], dtype=uint8) 
// but we want [1,2,3], how?  
// we can manually create a scijs/ndarray object, then assign it as selection property 
d.selection = nj.ndarray(new Uint8Array([1, 2, 3]));
// d.selection.data is the stored raw Uint8Array([1, 2, 3])

说明:可能的类型有:int8,int8,int16,int16,int32,int32,floot32,floto64,int8 clamped和数组(默认)

要创建带有给定形状的阵列, 您可以使用 zeros, (中文(简体) ), ones 或者说 random 函数:

> nj.zeros([2,3]);
array([[ 0, 0, 0],
       [ 0, 0, 0]])
> nj.ones([2,3,4], 'int32')     // dtype can also be specified
array([[[ 1, 1, 1, 1],
        [ 1, 1, 1, 1],
        [ 1, 1, 1, 1]],
       [[ 1, 1, 1, 1],
        [ 1, 1, 1, 1],
        [ 1, 1, 1, 1]]], dtype=int32)

> nj.random([4,3])
array([[ 0.9182 , 0.85176, 0.22587],
       [ 0.50088, 0.74376, 0.84024],
       [ 0.74045, 0.23345, 0.20289],
       [ 0.00612, 0.37732, 0.06932]])

为了建立数字序列, 数字Js 提供名为 arange数字 :

> nj.arange(4);
array([ 0, 1, 2, 3])

> nj.arange( 10, 30, 5 )
array([ 10, 15, 20, 25])

> nj.arange(1, 5, 'uint8');
array([ 1, 2, 3, 4], dtype=uint8)

可选 NdArray 构造参数, 斜起并相冲

密码就像

// pass data, shape, stride, offset arguments.
// this will call nj.ndarray([2, 3, 4], [3], [1], 0) and assign it to NdArray's selection property
const a = new nj.NdArray([2, 3, 4], [3], [1], 0);

或者你想在原始的 scijs ndarray 对象上申请

// scijs ndarray object
const a = nj.ndarray([2, 3, 4], [3], [1], 0);

NdArray and ndarray 也被导出。 您还可以使用

import { NdArray, ndarray } from "@d4c/numjs"
// or CommonJS:
const NdArray = require('numjs').NdArray;
const ndarray = require('numjs').ndarray;

减少打字 "nj." ..

关于阵列的更多信息

数字Js阵列类称为 NdArray被别名所取名 array。更为重要的属性 NdArray 对象为:

  • NdArray#ndim:阵列的轴数(dimensions).
  • NdArray#shape: 数组的尺寸。 这是一个表示每个维度中数组大小的整数列表. 对于有n行和m列的矩阵,形状为 [n,m]. 因此,形状的长度是维数,ndim.
  • NdArray#size: 数组的元素总数。 这相当于形状元素的产物.
  • NdArray#dtype: 描述数组中元素类型的字符串. int32, (中文(简体) ), int16,以及 float64 一些实例。 默认 Dtype 是 array。 。 。 .

一个 NdArray 总是可以转换成本地 JavaScript Array 使用 NdArray#tolist() 方法.

示例

> a = nj.arange(15).reshape(3, 5);
array([[  0,  1,  2,  3,  4],
       [  5,  6,  7,  8,  9],
       [ 10, 11, 12, 13, 14]])

> a.shape
[ 3, 5]
> a.ndim
2
> a.dtype
'array'
> a instanceof nj.NdArray
true
> a.tolist() instanceof Array
true
> a.get(1,1)
6
> a.set(0,0,1)
> a
array([[  1,  1,  2,  3,  4],
       [  5,  6,  7,  8,  9],
       [ 10, 11, 12, 13, 14]])

打印阵列

使用 nj.array([2,3,4] 作为例子。 在节点J, console.log(nj.array([2,3,4]) 将打印美化的内容, array([ 2, 3, 4])。在浏览器中,或在节点.js中使用调试器,请使用 console.log(nj.array([2,3,4].toString()) 以打印其被美化的内容. toString() 正在浏览器/ Node.js 中工作.

当你打印一个阵列的被美化的内容时, 数字Js 以类似嵌入式列表的方式显示,但布局如下:

  • 最后一个轴从左到右打印,
  • 第二至倒数从上到下打印,
  • 其余部分也从上而下地打印出,每个片段由一行空去相隔.

然后一维数组被打印为行,二维被打印为矩阵,三维被打印为矩阵列表.

> const a = nj.arange(6);                 // 1d array
> console.log(a);
array([ 0, 1, 2, 3, 4, 5])
>
> const b = nj.arange(12).reshape(4,3);   // 2d array
> console.log(b);
array([[  0,  1,  2],
       [  3,  4,  5],
       [  6,  7,  8],
       [  9, 10, 11]])
>
> const c = nj.arange(24).reshape(2,3,4); // 3d array
> console.log(c);
array([[[  0,  1,  2,  3],
        [  4,  5,  6,  7],
        [  8,  9, 10, 11]],
       [[ 12, 13, 14, 15],
        [ 16, 17, 18, 19],
        [ 20, 21, 22, 23]]])

如果一个阵列太大无法打印, 数字Js 自动跳过数组的中心部分,只打印角:

> console.log(nj.arange(10000).reshape(100,100))
array([[    0,    1, ...,   98,   99],
       [  100,  101, ...,  198,  199],
        ...
       [ 9800, 9801, ..., 9898, 9899],
       [ 9900, 9901, ..., 9998, 9999]])

要自定义此行为, 您可以使用 nj.config.printThreshold (默认为 7:

> nj.config.printThreshold = 9;
> console.log(nj.arange(10000).reshape(100,100))
array([[    0,    1,    2,    3, ...,   96,   97,   98,   99],
       [  100,  101,  102,  103, ...,  196,  197,  198,  199],
       [  200,  201,  202,  203, ...,  296,  297,  298,  299],
       [  300,  301,  302,  303, ...,  396,  397,  398,  399],
        ...
       [ 9600, 9601, 9602, 9603, ..., 9696, 9697, 9698, 9699],
       [ 9700, 9701, 9702, 9703, ..., 9796, 9797, 9798, 9799],
       [ 9800, 9801, 9802, 9803, ..., 9896, 9897, 9898, 9899],
       [ 9900, 9901, 9902, 9903, ..., 9996, 9997, 9998, 9999]])

索引编制

单一元素索引用途 get 财务报告和审定财务报表 set 方法。 。 。 它基于0,并接受从数组末尾索引的负指数:

> const a = nj.array([0,1,2]);
> a.get(1)
1
>
> a.get(-1)
2
>
> const b = nj.arange(3*3).reshape(3,3);
> b
array([[  0,  1,  2],
       [  3,  4,  5],
       [  6,  7,  8])
>
> b.get(1, 1);
4
>
> b.get(-1, -1);
8
> b.set(0,0,1);
> b
array([[ 1, 1, 2],
       [ 3, 4, 5],
       [ 6, 7, 8]])

切开和切开

可以切片并出步数组来取出同个维数但大小与原相异的数组. 切片和切片在NumPy的操作方式完全相同:

> const a = nj.arange(5);
> a
array([  0,  1,  2,  3,  4])
>
> a.slice(1) // skip the first item, same as a[1:]
array([ 1, 2, 3, 4])
>
> a.slice(-3) // takes the last 3 items, same as a[-3:]
array([ 2, 3, 4])
>
> a.slice([4]) // takes the first 4 items, same as a[:4]
array([ 0, 1, 2, 3])
>
> a.slice([-2]) // skip the last 2 items, same as a[:-2]
array([ 0, 1, 2])
>
> a.slice([1,4]) // same as a[1:4]
array([ 1, 2, 3])
>
> a.slice([1,4,-1]) // same as a[1:4:-1]
array([ 3, 2, 1])
>
> a.slice([null,null,-1]) // same as a[::-1]
array([ 4, 3, 2, 1, 0])
>
> const b = nj.arange(5*5).reshape(5,5);
> b
array([[  0,  1,  2,  3,  4],
       [  5,  6,  7,  8,  9],
       [ 10, 11, 12, 13, 14],
       [ 15, 16, 17, 18, 19],
       [ 20, 21, 22, 23, 24]])
>
> b.slice(1,2) //  skip the first row and the 2 first  columns, same as b[1:,2:]
array([[  7,  8,  9],
       [ 12, 13, 14],
       [ 17, 18, 19],
       [ 22, 23, 24]])
>
> b.slice(null, [null, null, -1]) // reverse rows, same as b[:, ::-1]
array([[  4,  3,  2,  1,  0],
       [  9,  8,  7,  6,  5],
       [ 14, 13, 12, 11, 10],
       [ 19, 18, 17, 16, 15],
       [ 24, 23, 22, 21, 20]])

注意切片不复制内部数组数据,它会产生原始数据的新视图.

基本业务

算术运算符,例如 * (单位:千美元)multiply, (中文(简体) ), + (单位:千美元)add, (中文(简体) ), - (单位:千美元)subtract, (中文(简体) ), / (单位:千美元)divide, (中文(简体) ), ** (单位:千美元)pow, (中文(简体) ), = (单位:千美元)assign)应用elemen-twise. 创建一个新的数组并填充结果 :

> zeros = nj.zeros([3,4]);
array([[ 0, 0, 0, 0],
       [ 0, 0, 0, 0],
       [ 0, 0, 0, 0]])
>
> ones = nj.ones([3,4]);
array([[ 1, 1, 1, 1],
       [ 1, 1, 1, 1],
       [ 1, 1, 1, 1]])
>
> ones.add(ones)
array([[ 2, 2, 2, 2],
       [ 2, 2, 2, 2],
       [ 2, 2, 2, 2]])
>
> ones.subtract(ones)
array([[ 0, 0, 0, 0],
       [ 0, 0, 0, 0],
       [ 0, 0, 0, 0]])
>
> zeros.pow(zeros)
array([[ 1, 1, 1, 1],
       [ 1, 1, 1, 1],
       [ 1, 1, 1, 1]])
>

要修改已有的数组,而不是创建新的数组,您可以设置 copy 参数改为 false数字 :

> ones = nj.ones([3,4]);
array([[ 1, 1, 1, 1],
       [ 1, 1, 1, 1],
       [ 1, 1, 1, 1]])
>
> ones.add(ones, false)
array([[ 2, 2, 2, 2],
       [ 2, 2, 2, 2],
       [ 2, 2, 2, 2]])
>
> ones
array([[ 2, 2, 2, 2],
       [ 2, 2, 2, 2],
       [ 2, 2, 2, 2]])
>
> zeros = nj.zeros([3,4])
> zeros.slice([1,-1],[1,-1]).assign(1, false);
> zeros
array([[ 0, 0, 0, 0],
       [ 0, 1, 1, 0],
       [ 0, 0, 0, 0]])

说明: 可供 add, (中文(简体) ), subtract, (中文(简体) ), multiply, (中文(简体) ), divide, (中文(简体) ), assign 财务报告和审定财务报表 pow 方法。 。 .

矩阵产品可以使用 dot 函数 :

> a = nj.arange(12).reshape(3,4);
array([[  0,  1,  2,  3],
       [  4,  5,  6,  7],
       [  8,  9, 10, 11]])
>
> nj.dot(a.T, a)
array([[  80,  92, 104, 116],
       [  92, 107, 122, 137],
       [ 104, 122, 140, 158],
       [ 116, 137, 158, 179]])
>
> nj.dot(a, a.T)
array([[  14,  38,  62],
       [  38, 126, 214],
       [  62, 214, 366]])

许多非活性操作,如计算数组中所有元素的总和,都作为方法执行 NdArray 类 :

> a = nj.random([2,3])
array([[0.62755, 0.8278,0.21384],
       [ 0.7029,0.27584,0.46472]])
> a.sum()
3.1126488673035055
>
> a.min()
0.2138431086204946
>
> a.max()
0.8278025290928781
>
> a.mean()
0.5187748112172509
>
> a.std()
0.22216977543691244

通用函数

数字Js 提供熟悉的数学函数,例如 sin, (中文(简体) ), cos,以及 exp。这些函数在一个阵列上按元素运行,生成 NdArray 作为输出 :

> a = nj.array([-1, 0, 1])
array([-1, 0, 1])
>
> nj.negative(a)
array([ 1, 0,-1])
>
> nj.abs(a)
array([ 1, 0, 1])
>
> nj.exp(a)
array([ 0.36788,       1, 2.71828])
>
> nj.tanh(a)
array([-0.76159,       0, 0.76159])
>
> nj.softmax(a)
array([ 0.09003, 0.24473, 0.66524])
>
> nj.sigmoid(a)
array([ 0.26894,     0.5, 0.73106])
>
> nj.exp(a)
array([ 0.36788,       1, 2.71828])
>
> nj.log(nj.exp(a))
array([-1, 0, 1])
>
> nj.sqrt(nj.abs(a))
array([ 1, 0, 1])
>
> nj.sin(nj.arcsin(a))
array([-1, 0, 1])
>
> nj.cos(nj.arccos(a))
array([-1, 0, 1])
>
> nj.tan(nj.arctan(a))
array([-1, 0, 1])

形状操纵

数组的形状由每个轴的元素数量决定:

> a = nj.array([[  0,  1,  2,  3], [  4,  5,  6,  7], [  8,  9, 10, 11]]);
array([[  0,  1,  2,  3],
       [  4,  5,  6,  7],
       [  8,  9, 10, 11]])

> a.shape
[ 3, 4 ]

数组的外形可以用曲折命令来改变 :

> a.flatten();
array([  0,  1,  2, ...,  9, 10, 11])
>
> a.T                   // equivalent to a.transpose(1,0)
array([[  0,  4,  8],
       [  1,  5,  9],
       [  2,  6, 10],
       [  3,  7, 11]])
>
> a.reshape(4,3)
array([[  0,  1,  2],
       [  3,  4,  5],
       [  6,  7,  8],
       [  9, 10, 11]])
>

自兹 a 我们也许想要它的对角:

> nj.diag(a)
array([  0,  5, 10])
>

身份矩阵

身份阵列是一个正方形阵列,主要对角有:

> nj.identity(3)
array([[ 1, 0, 0],
       [ 0, 1, 0],
       [ 0, 0, 1]])

连接不同的数组

多个数组可使用 concatenate 函数 :

> a = nj.arange(12).reshape(3,4)
array([[  0,  1,  2,  3],
       [  4,  5,  6,  7],
       [  8,  9, 10, 11]])
>
> b = nj.arange(3)
array([ 0, 1, 2])
>
> nj.concatenate(a,b.reshape(3,1))
array([[  0,  1,  2,  3,  0],
       [  4,  5,  6,  7,  1],
       [  8,  9, 10, 11,  2]])

页:1数字 :

  • 数组必须具有相同的形状, 除了最后一个维
  • 数组沿后一轴排列

仍有可能使用转接法将其他维相连接:

> a = nj.arange(12).reshape(3,4)
array([[  0,  1,  2,  3],
       [  4,  5,  6,  7],
       [  8,  9, 10, 11]])
>
> b = nj.arange(4)
array([ 0, 1, 2, 3])
>
> nj.concatenate(a.T,b.reshape(4,1)).T
array([[  0,  1,  2,  3],
       [  4,  5,  6,  7],
       [  8,  9, 10, 11],
       [  0,  1,  2,  3]])

堆叠多个数组

> a = nj.array([1, 2, 3])
> b = nj.array([2, 3, 4])

> nj.stack([a, b])
array([[1, 2, 3],
       [2, 3, 4]])
> nj.stack([a, b], -1)
array([[1, 2],
       [2, 3],
       [3, 4]])

页:1数字 :

  • 阵列必须具有相同的形状
  • 选择可选轴参数,该参数可以是负数

深层复制

这个 clone 方法使数组及其数据的完整副本.

> a = nj.arange(12).reshape(3,4)
array([[  0,  1,  2,  3],
       [  4,  5,  6,  7],
       [  8,  9, 10, 11]])
>
> b = a.clone()
array([[  0,  1,  2,  3],
       [  4,  5,  6,  7],
       [  8,  9, 10, 11]])
>
> a === b
false
>
> a.set(0,0,1)
> a
array([[  1,  1,  2,  3],
       [  4,  5,  6,  7],
       [  8,  9, 10, 11]])
> b
array([[  0,  1,  2,  3],
       [  4,  5,  6,  7],
       [  8,  9, 10, 11]])

快速傅里叶变形 (FFT)

fft 财务报告和审定财务报表 ifft 函数可用于计算N维离散的傅里叶变形及其反相.

示例

> RI = nj.concatenate(nj.ones([10,1]), nj.zeros([10,1]))
array([[ 1, 0],
       [ 1, 0],
       [ 1, 0],
        ...
       [ 1, 0],
       [ 1, 0],
       [ 1, 0]])
>
> fft = nj.fft(RI)
array([[ 10,  0],
       [  0,  0],
       [  0,  0],
        ...
       [  0,  0],
       [  0,  0],
       [  0,  0]])
>
> nj.ifft(fft)
array([[ 1, 0],
       [ 1, 0],
       [ 1, 0],
        ...
       [ 1, 0],
       [ 1, 0],
       [ 1, 0]])

说明: 两者 fft 财务报告和审定财务报表 ifft 期望数组的最后一个维度包含 2 个值: 真实值和假想值

进取

convolve 函数计算两个多维数组的离散线性演化.

说明: 演化产物只用于信号完全重叠的点. 信号边界外的值没有效果. 这种行为也被称为"有效"模式.

示例

> x = nj.array([0,0,1,2,1,0,0])
array([ 0, 0, 1, 2, 1, 0, 0])
>
> nj.convolve(x, [-1,0,1])
array([-1,-2, 0, 2, 1])
>
> const a = nj.arange(25).reshape(5,5)
> a
array([[  0,  1,  2,  3,  4],
       [  5,  6,  7,  8,  9],
       [ 10, 11, 12, 13, 14],
       [ 15, 16, 17, 18, 19],
       [ 20, 21, 22, 23, 24]])
> nj.convolve(a, [[ 1, 2, 1], [ 0, 0, 0], [-1,-2,-1]])
array([[ 40, 40, 40],
       [ 40, 40, 40],
       [ 40, 40, 40]])
> nj.convolve(nj.convolve(a, [[1, 2, 1]]), [[1],[0],[-1]])
array([[ 40, 40, 40],
       [ 40, 40, 40],
       [ 40, 40, 40]])

说明数字 : convolve 使用Fast Fourier Transform (FFT)来加速对大型阵列的计算.

其他倾斜

rot90

> m = nj.array([[1,2],[3,4]], 'int8')
> m
array([[1, 2],
       [3, 4]])
> nj.rot90(m)
array([[2, 4],
       [1, 3]])
> nj.rot90(m, 2)
array([[4, 3],
       [2, 1]])
> m = nj.arange(8).reshape([2,2,2])
> nj.rot90(m, 1, [1,2])
array([[[1, 3],
        [0, 2]],
      [[5, 7],
       [4, 6]]])

mod (自v.16.0起)

> nj.mod(nj.arange(7), 5)
> m
array([0, 1, 2, 3, 4, 0, 1])

贡献者

此工程是 TypeScript 移植 数字 以 @nicolaspanel (英语)。 。 。 .

感谢下列人士的贡献:

  • @pppp606 (英语) ——支持 multiply 财务报告和审定财务报表 divide (单位:千美元)#14号(中文(简体) )

文档

版本与发布记录

@d4c/numjs 共发布 36 个版本,首次发布于 2021/11/08;过去 12 个月发布了 1 个版本。

版本发布日期距今
0.17.35latest2026/03/078 个月前
0.17.342021/11/224 年前
0.17.332021/11/214 年前
0.17.322021/11/214 年前
0.17.312021/11/214 年前
0.17.302021/11/204 年前

关于 @d4c/numjs 的常见问题

@d4c/numjs 是什么?

像 NumPy, 在 TypeScript 和 JavaScript 中

如何安装 @d4c/numjs?

在项目目录运行 npm install @d4c/numjs,或使用 pnpm add / yarn add / bun add。

@d4c/numjs 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@d4c/numjs 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@d4c/numjs 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=20。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@d4c/numjs 可以商用吗?

@d4c/numjs 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@d4c/numjs 的下载量有多少?

根据 npm 官方下载统计,@d4c/numjs 在 2026/10/11 – 2026/11/09 这 30 天内被下载 2,492 次,日均约 83 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@d4c/numjs 还在维护吗?

最新版本 0.17.35 发布于 2026/03/07(8 个月前);至今共发布 36 个版本,其中过去 12 个月发布了 1 个;首次发布于 2021/11/08。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。