@d4c/numjs (韩语)
维持状况: 这个项目在 被动维修 模式 —— 关键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号(中文(简体) )