numcpp
简介
一个高性能数学计算库
组件接口
numcpp.gs
枚举
NcType
枚举成员 | 值 | 描述 |
---|---|---|
INT_TYPE | 0 | |
REAL_TYPE | 1 | |
BOOL_TYPE | 2 |
NcAxis
枚举成员 | 值 | 描述 |
---|---|---|
NONE | 0 | |
ROW | 1 | |
COL | 2 |
类
NdArray
NumCpp array encapsulation
Class only support int and float type and some specific bool functions
In C++ level all NdArray class is created by new
成员变量
变量名 | 类型 | 初始值 | 须初始化 | 描述 |
---|---|---|---|---|
arr_data | array | nil | 可选 | |
arr_ptr | int | 0 | 可选 | |
arr_type | NcType | "(NcType)0" | 可选 |
成员方法
函数原型 | 函数作用 |
---|---|
NcShape shape() | 返回当前矩阵规模ncshape |
NdArray reshape(int rows, int cols = -1) | 元素数目不变,修改矩阵行数和列数,如将2 * 8 矩阵修改为 4 * 4 矩阵 |
NdArray astype(NcType type) | 转换矩阵类型,相同类型会进行拷贝 |
void print() | 打印矩阵信息,支持BOOL_TYPE |
mixed at(int row_num, int col_num) | 返回NdArray[row_num][col_num] 处数值 |
NdArray range(int top, int bottom, int left, int right, int row_step = 1, int col_step = 1) | 返回一个新的NdArray其范围为[top,left]->[bottom,right] ,step为间隔 |
void assign(int row_num, int col_num, mixed value) | 赋值语句NdArray[row_num][col_num] = value |
NdArray update() | 将C++中矩阵数据更新至类成员中arr_data数组 |
NdArray copy() | 矩阵深复制 |
样例
// 创建NdArray矩阵,默认为NcType.INT_TYPE, NcType.REAL_TYPE需手动指定,否则数组中数字会被强制类型转换为int
NdArray ndarr0 = numcpp.nc_create([[1,2,3],[4,5,6],[7,8,9]]);
NdArray ndarr1 = numcpp.nc_create([[1,2,3,4,5],[4,5,6,7,8]]); //INT_TYPE
NdArray ndarr2 = numcpp.nc_create([[1.0,2,3,4,5],[4,5,6,7,8]], NcType.REAL_TYPE); //REAL_TYPE
// 矩阵深复制
NdArray copy_arr = ndarr0.copy();
copy_arr.print();
// 矩阵乘法
numcpp.nc_dot(ndarr0, ndarr0).print();
// 普通乘法
numcpp.nc_multi(ndarr0, 8).print();
numcpp.nc_multi(ndarr0, ndarr0).print();
// 意同where(ndarr1 > 3, 3, ndarr1)
numcpp.nc_where(numcpp.nc_more(ndarr1, 3), 3, ndarr1).print();
// 比较两个矩阵是否相同(注意两个矩阵类型应相同)
numcpp.nc_equal(ndarr1, ndarr1).print();
// 打印矩阵数据
ndarr1.print();
ndarr2.print();
// 获取矩阵规模,即矩阵总行数及总列数
NcShape ndshape = ndarr1.shape();
write(ndshape);
// 将矩阵ndarr1由两行5列调整为1行10列
ndarr1.reshape(1,10);
ndarr1.print();
// 将矩阵ndarr2由REALTYPE转换为INT_TYPR
NdArray ndarr3 = ndarr2.astype(NcType.INT_TYPE);
ndarr3.print();
// 读取ndarr2[0][1]处数值, 但不更新 ndarr2.arr_data",
write(ndarr2.at(0, 1),"\n");
// 从(0, 0)到(2, 5)范围内数据,行间隔为1,列间隔为2
ndarr2.range(0, 2, 0, 5, 1, 2).print();
// 将c++中矩阵数组数据更新至GS ndarr2.arr_data中
ndarr2.update();
write(ndarr2.arr_data);
// 创建均匀样本NdArray,NdArray类型取决于start参数类型
numcpp.nc_linspace(1, 10, 5).print();//由1决定类型为INT_TYPE
numcpp.nc_linspace(1.0, 10.0, 5).print();//由1.0决定类型为REAL_TYPE
//create eye ndarray ,need to specify type,0 means diagonal offset
numcpp.nc_eye(2,2,0,NcType.REAL_TYPE).print();
//random seed
numcpp.nc_seed(55);
//rand func
numcpp.nc_randn(2,2).print();//only return REAL_TYPE
write(numcpp.nc_randn(),"\n");//return single value
mixed ndarr4 = numcpp.nc_create([[1,1,1],[1,1,1],[1,1,0]]);
mixed ndarr5 = numcpp.nc_create([[1,1,0],[1,0,0],[0,0,0]]);
numcpp.nc_vstack([ndarr2, ndarr2]).print();
numcpp.nc_append(ndarr2,ndarr2).print();
numcpp.nc_diagonal(numcpp.nc_create([[1,2,3],[4,5,6],[7,8,9]])).print();
numcpp.nc_triu(numcpp.nc_create([[1,2,3],[4,5,6],[7,8,9]])).print();
numcpp.nc_filp(ndarr4).print();
numcpp.nc_any(ndarr4).print();
numcpp.nc_all(ndarr4).print();
write(numcpp.nc_allclose(ndarr4,numcpp.nc_add(ndarr4,1),0.5));
numcpp.nc_logical_and(ndarr4,ndarr5).print();
numcpp.nc_logical_or(ndarr4,ndarr5).print();
numcpp.nc_less(ndarr5,ndarr4).print();
numcpp.nc_more(ndarr4,ndarr5).print();
numcpp.nc_less_equal(ndarr4,ndarr5).print();
numcpp.nc_more_equal(ndarr5,ndarr4).print();
numcpp.nc_equal(ndarr4,ndarr4).print();
numcpp.nc_not_equal(ndarr4,ndarr4).print();
numcpp.nc_not(ndarr4).print();
NdArray ndarr6 = numcpp.nc_create([[1,2,3],[4,1,6]]);
NdArray ndarr7 = numcpp.nc_create([[1,-2,30],[1,4,20]]);
numcpp.nc_bitand(ndarr6,numcpp.nc_create([[1,1,3],[6,4,14]])).print();
// write(numcpp.nc_nonzero(ndarr5));
numcpp.nc_min(ndarr6,NcAxis.ROW).print();
numcpp.nc_min(ndarr6,NcAxis.COL).print();
numcpp.nc_min(ndarr6).print();
numcpp.nc_argmin(ndarr6,NcAxis.COL).print();
numcpp.nc_sort(ndarr6).print();
numcpp.nc_unique(ndarr6).print();
numcpp.nc_diff(ndarr7).print();
numcpp.nc_prod(ndarr6).print();
numcpp.nc_mean(ndarr6).print();
numcpp.nc_count_nonzero(ndarr5).print();
numcpp.nc_abs(ndarr7).print();
numcpp.nc_sign(ndarr7).print();
numcpp.nc_remainer(ndarr7,ndarr6).print();
NdArray ndarr8 = numcpp.nc_create([2.0,4,6,8,10,12], NcType.REAL_TYPE);
NdArray ndarr9 = numcpp.nc_create([1.1,2.55,3,4,4.8,6], NcType.REAL_TYPE);
numcpp.nc_interp(ndarr9,numcpp.nc_create([1.0,2,3,4,5,6], NcType.REAL_TYPE),ndarr8).print();
numcpp.nc_exp(ndarr8).print();
numcpp.nc_log(ndarr8).print();
numcpp.nc_power(ndarr8,2).print();
NdArray ndarr10 = numcpp.nc_create([[2,4],[6,8]]);
numcpp.nc_inv(ndarr10).print();
write(numcpp.nc_det(ndarr10));
NdArray ndarr11 = numcpp.nc_create([[2.1435664,4.1435664],[6.1435664,8.1435664]], NcType.REAL_TYPE);
numcpp.nc_around(ndarr11, 2).print();
numcpp.nc_ceil(ndarr11).print();
numcpp.nc_floor(ndarr11).print();