跳到主要内容

numcpp

简介

一个高性能数学计算库

组件接口

numcpp.gs

函数原型函数作用
NdArray nc_create(array values, NcType arr_type = "NcType.INT_TYPE")由GS数组创建NdArray, 最高为2维,NdArray类型取决于GS数组开头元素类型
NdArray nc_linspace(mixed start, mixed stop, int num = 50, bool endpoint = true)返回在区间 [start, stop] 内的num个均匀样本,endpoint可选择排除端点
NdArray nc_arange(mixed start, mixed stop, mixed step = 1)返回在左闭右开区间[start, stop)区间内均匀间隔step的值,注意若使用非整型间隔推荐使用linspace。
NdArray nc_eye(int arr_rows, int arr_cols = -1, int arr_offset = 0, NcType arr_type = "NcType.INT_TYPE")返回一个offset对角线为 1,其他地方为 0 的arr_rows行,arr_cols列的二维数组
NdArray nc_zeros(int arr_rows, int arr_cols = -1, NcType arr_type = "NcType.INT_TYPE")返回一个全零的二维数组
NdArray nc_ones(int arr_rows, int arr_cols = -1, NcType arr_type = "NcType.INT_TYPE")返回一个全一的二维数组
NdArray nc_nans(int arr_rows, int arr_cols = -1)返回一个全 nans的二维数组
NdArray nc_empty(int arr_rows, int arr_cols = -1, NcType arr_type = "NcType.INT_TYPE")返回给定形状和类型的数组,数据未初始化
void nc_seed(int in_seed)随机数生成器种子
mixed nc_randn(int arr_rows = -1, int arr_cols = -1)创建一个给定形状的数组,并用“标准正态”分布中的随机样本填充它, REAL_TYPE矩阵
mixed nc_randint(int low_limit, int high_limit = 0, int arr_rows = -1, int arr_cols = -1)返回左闭右开[low_limit, high_limit)区间内的具有给定的行列的随机整数, INT_TYPE矩阵
mixed nc_rand(int arr_rows = -1, int arr_cols = -1)创建一个给定形状的数组,并用来自左闭右开区间[0, 1) 上均匀分布的随机样本填充它, REAL_TYPE矩阵
mixed nc_choice(NdArray nd_arr, int choice_num = -1, bool replace = true)从输入矩阵中选择choice_num个随机样本
NdArray nc_vstack(array arr_list)NdArray数组按行堆叠
NdArray nc_hstack(array arr_list)NdArray数组按列堆叠
NdArray nc_stack(array arr_list, NcAxis axis_type = "NcAxis.NONE")NdArray数组按指定轴arr_axis堆叠
NdArray nc_append(NdArray nd_arr, NdArray arr_append, NcAxis axis_type = "NcAxis.NONE")将矩阵arr_append沿指定轴axis_type附加到矩阵nd_arr的末尾
NdArray nc_diagonal(NdArray nd_arr, int offset = 0, NcAxis axis_type = "NcAxis.ROW")返回指定的对角线
NdArray nc_triu(NdArray nd_arr, int offset = 0)数组的上三角形,返回一个数组的副本,其中第 offset对角线下方的元素为零
NdArray nc_triu_shape(int arr_rows, int arr_cols, int offset = 0, NcType arr_type = "NcType.INT_TYPE")创建一个arr_rows * arr_cols矩阵,其中第 offset对角线下方的元素为零
NdArray nc_tril(NdArray nd_arr, int offset = 0)返回一个数组的副本,其中第 offset 对角线上方的元素为0
NdArray nc_tril_shape(int arr_rows, int arr_cols, int offset = 0, NcType arr_type = "NcType.INT_TYPE")创建一个arr_rows * arr_cols数组,其中第 offset 对角线上方的元素为0
NdArray nc_filp(NdArray nd_arr, NcAxis arr_axis = "NcAxis.NONE")沿指定轴arr_axis翻转矩阵
NdArray nc_filpud(NdArray nd_arr)上下翻转数组
NdArray nc_filplr(NdArray nd_arr)左右翻转数组
NdArray nc_any(NdArray nd_arr, NcAxis arr_axis = "NcAxis.NONE")测试矩阵NdArray沿给定轴的任何数组元素是否评估为 True (支持BOOL_TYPE)
NdArray nc_all(NdArray nd_arr, NcAxis arr_axis = "NcAxis.NONE")测试矩阵NdArray沿给定轴的所有数组元素是否评估为 True (支持BOOL_TYPE)
bool nc_allclose(NdArray nd_arr1, NdArray nd_arr2, float num_tolerance)如果两个矩阵在容差范围内按元素相等,则返回 True
NdArray nc_logical_and(NdArray nd_arr, mixed arr_or_value)逻辑与 NdArray && NdArray 或 NdArray && single_value (支持BOOL_TYPE)
NdArray nc_logical_or(NdArray nd_arr, mixed arr_or_value)逻辑或 NdArray
NdArray nc_less(mixed arr_or_value1, mixed arr_or_value2)小于 NdArray < NdArray 或 NdArray < single_valuesingle_value < NdArray
NdArray nc_more(mixed arr_or_value1, mixed arr_or_value2)大于 NdArray > NdArrayNdArray > single_valuesingle_value > NdArray
NdArray nc_less_equal(mixed arr_or_value1, mixed arr_or_value2)小于等于 NdArray <= NdArrayNdArray <= single_valuesingle_value <= NdArray
NdArray nc_more_equal(mixed arr_or_value1, mixed arr_or_value2)大于等于 NdArray >= NdArrayNdArray >= single_valuesingle_value >= NdArray
NdArray nc_equal(NdArray nd_arr, mixed arr_or_value)等于 NdArray == NdArray 或 NdArray == single_value
NdArray nc_not_equal(NdArray nd_arr, mixed arr_or_value)不等于 NdArray != NdArray 或 NdArray != single_value
NdArray nc_not(NdArray nd_arr)非 !NdArray
NdArray nc_dot(NdArray nd_arr1, NdArray nd_arr2)矩阵点积
NdArray nc_mod(mixed arr_or_value1, mixed arr_or_value2)取余 NdArray % NdArray 或 NdArray % single_value 或 single_value % NdArray(仅支持INT_TYPE)
NdArray nc_bitand(NdArray nd_arr, mixed arr_or_value)按位与 NdArray & NdArray 或 NdArray & single_value
NdArray nc_bitor(NdArray nd_arr, mixed arr_or_value)按位或 NdArray
array nc_nonzero(NdArray nd_arr)返回非零元素的索引的数组
NdArray nc_min(NdArray nd_arr, NcAxis arr_axis = "NcAxis.NONE")返回矩阵的最小值沿给定轴的最小值
NdArray nc_max(NdArray nd_arr, NcAxis arr_axis = "NcAxis.NONE")返回矩阵的最大值或沿轴的最大值
NdArray nc_argmin(NdArray nd_arr, NcAxis arr_axis = "NcAxis.NONE")返回最小值的索引或沿轴的最小值的索引
NdArray nc_argmax(NdArray nd_arr, NcAxis arr_axis = "NcAxis.NONE")返回最大值的索引或沿轴的最大值的索引
NdArray nc_sort(NdArray nd_arr, NcAxis arr_axis = "NcAxis.NONE")返回一个数组的排序拷贝
NdArray nc_argsort(NdArray nd_arr, NcAxis arr_axis = "NcAxis.NONE")返回对数组进行排序的索引
NdArray nc_unique(NdArray nd_arr)查找*数组的唯一元素, 返回数组中排序后的唯一元素。
NdArray nc_setdiff1d(NdArray nd_arr1, NdArray nd_arr2)求两个数组的集差。返回在 nd_arr1 中,没有在 nd_arr2 中的排序的值。
NdArray nc_diff(NdArray nd_arr, NcAxis arr_axis = "NcAxis.NONE")计算沿给定轴的离散差
NdArray nc_sum(NdArray nd_arr, NcAxis arr_axis = "NcAxis.NONE")矩阵给定轴上元素的总和。
NdArray nc_prod(NdArray nd_arr, NcAxis arr_axis = "NcAxis.NONE")返回给定轴上矩阵元素的乘积
NdArray nc_mean(NdArray nd_arr, NcAxis arr_axis = "NcAxis.NONE")计算沿指定轴的平均值
NdArray nc_count_nonzero(NdArray nd_arr, NcAxis arr_axis = "NcAxis.NONE")计算数组中非零值的数量
NdArray nc_abs(NdArray nd_arr)按元素计算绝对值
mixed nc_sign(mixed arr_or_value)sign 函数, x < 0 返回 -1, x == 0 返回0, x > 0 返回1。nan 返回 nan。
NdArray nc_remainer(mixed arr_or_value1, mixed arr_or_value2)返回除法的逐元素余数
NdArray nc_clip(NdArray nd_arr, mixed min_value, mixed max_value)给定一个区间,区间外的值被剪裁到区间边缘。数组中小于min_value的值被设置为min_value,大于max_value的值被设置为max_value
NdArray nc_interp(NdArray in_x, NdArray in_xp, NdArray in_fp)一维线性插值。将一维分段线性插值返回到具有离散数据点的给定值的函数。in_x为插值点横坐标NdArray,in_xp,in_fp则为原始数据点横坐标和纵坐标NdArray
mixed nc_exp(mixed arr_or_value)指数函数,计算输入矩阵中所有元素的以e为底指数
mixed nc_expm1(mixed arr_or_value)计算矩阵中的所有元素 exp(x) - 1。
mixed nc_log(mixed arr_or_value)计算矩阵中所有元素的对数。
mixed nc_log1p(mixed arr_or_value)返回一加输入数组的自然对数。计算 log(1 + x)。
NdArray nc_power(NdArray nd_arr, mixed arr_or_value)将数组元素提升到输入浮点数的幂,即求nd_arr的exponents_arr次方
mixed nc_sqrt(mixed arr_or_value)按元素计算矩阵的正平方根
mixed nc_square(mixed arr_or_value)返回数组的平方
mixed nc_cbrt(mixed arr_or_value)按元素返回矩阵的立方根
mixed nc_cos(mixed arr_or_value)三角余弦,逐元素。
mixed nc_sin(mixed arr_or_value)三角正弦,逐元素。
mixed nc_tan(mixed arr_or_value)三角正切,逐元素。
mixed nc_cosh(mixed arr_or_value)双曲余弦,逐元素
mixed nc_sinh(mixed arr_or_value)双曲正弦,逐元素
mixed nc_tanh(mixed arr_or_value)双曲正切,逐元素
mixed nc_isnan(mixed arr_or_value)测试 NaN 并将结果作为布尔值返回
NdArray nc_norm(NdArray nd_arr, NcAxis axis_type = "NcAxis.NONE")矩阵范数
NdArray nc_add(NdArray nd_arr1, mixed arr_or_value)矩阵加法
NdArray nc_sub(mixed arr_or_value1, mixed arr_or_value2)矩阵减法
NdArray nc_multi(NdArray nd_arr1, mixed arr_or_value)矩阵乘法
NdArray nc_divide(mixed arr_or_value1, mixed arr_or_value2)矩阵除法
mixed nc_det(NdArray nd_arr1)矩阵行列式。 注意:对于大型矩阵(顺序> 10)可能会变慢
NdArray nc_inv(NdArray nd_arr1)矩阵逆
NdArray nc_lstsq(NdArray arr_a, NdArray arr_b, float num_tolerance)通过计算最小化欧几里得 2-范数的向量 x 来求解方程 `a x = b
NdArray nc_matrix_power(NdArray nd_arr, int power)对于正整数 n,幂是通过重复的矩阵平方和矩阵乘法计算的。如果 n == 0,则返回与 M 形状相同的单位矩阵。如果 n < 0,则计算逆,然后提升到 abs(n)。
void nc_svd(NdArray arr_in, NdArray arr_outu, NdArray arr_outs, NdArray arr_outvt)
void nc_tofile_binary(NdArray nd_arr, string path)I/O 将矩阵保存为二进制文件
void nc_tofile_text(NdArray nd_arr, string path, int sep = " ")I/O 将矩阵保存为文本文件
NdArray nc_fromfile_binary(string path, NcType arr_type = "NcType.INT_TYPE")I/O 从二进制文件恢复矩阵
NdArray nc_fromfile_text(string path, NcType arr_type = "NcType.INT_TYPE", int sep = " ")I/O 从文本文件恢复数组
void nc_dump(NdArray nd_arr, string path)将数组的二进制文件转储到指定文件。可以使用nc::load读回数组。
NdArray nc_load(string path, NcType arr_type = "NcType.INT_TYPE")将dump()方法中生成的 .bin 文件加载到NdArray中
NdArray nc_where(NdArray arr_bool, mixed arr_or_value1, mixed arr_or_value2)使用方式为nc_where(nc_more(Ndarry1, Ndarry2), Ndarry_or_value, Ndarry_or_value)
NdArray nc_transpose(NdArray in_array)矩阵转置
NdArray nc_around(NdArray in_array, int in_num_decimals)四舍五入到给定的小数位数。
NdArray nc_ceil(NdArray in_array)返回输入的上限 例如 -1.2 返回 -1 , 1.2 返回 2
NdArray nc_floor(NdArray in_array)返回输入的下限 例如 -1.2 返回 -2 , 1.2 返回 1

枚举

NcType

枚举成员描述
INT_TYPE0
REAL_TYPE1
BOOL_TYPE2

NcAxis

枚举成员描述
NONE0
ROW1
COL2

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_dataarraynil可选
arr_ptrint0可选
arr_typeNcType"(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();