由本人阅读nd4j源码整理,nd4j是dl4j为了矩阵运算整出来的一套工具。对应python里的numpy,但是并没有numpy那么普及,不过至少使用dl4j搭建神经网络以及数据预处理时,会使用nd4j是必不可少的。
nd4j还有个功能是可以创建工作区workspace用来管理堆内存的回收,或者我们直接扔给GC来管理INDArray的内存回收就好。这个功能以后有机会再说,那么进入正题:
矩阵创建方法
用法
Nd4j.zeros / ones / valueArrayOf
创建全部元素都是0/1/value的矩阵或向量
通用函数:
valueArrayOf(int[] shape, double value)
实数版:
complexValueOf
Nd4j.create
将double数组转化为N维向量
create(double [] data,int [] shape)
二维数组
Create(double [][] data)
Nd4j.rand
输出随机矩阵,(0,1)之间随机值
rand(int [] shape)
rand(int [] shape, long seed)
Nd4j.linspace
输出数值等差的一维向量
Nd4j.diag
以某个标量/向量/矩阵为对角生成对角矩阵
Nd4j.eye
单位矩阵
矩阵属性
属性
用法
Rows,columns
可以用getRow和getColumn获取某一行或者某一列的视图,并可以通过修改视图对原始数据进行局部修改。不想对原数据修改,可调用dup函数进行复制。
可以用rows和columns来获取有多少行多少列
shape
Int[] 返回每一维的维度 (Arrays.toString可用于打印维度)
rank
维数
length
总共元素的个数(各个维度相乘)
data()
返回一个线性double数组替代这个INDArray
矩阵数值变换、点积
方法
用法
get
get(INDArrayIndexes...indexes)
获取每一维的某几个index的数据组成的视图。对该视图的直接操作将影响原始数据。
subArray
offset,shape ,stride
返回子图
addi
add
sub
rsub
mul
div
rdiv
neg
eq
标量的加减乘除取负比较等等,
后面加i代表in_place就是替换原数据的意思。
前面加r就是用参数来减、除矩阵中的value。
对每个矩阵中的值做操作,都是标量计算。
add和mul参数可以传入和被操作数大小相同的矩阵,即两个矩阵对应的每个参数相加或相乘
put
替换矩阵中的某些值
putscalar
标量替换某些值
reshape
将矩阵变换为新的维数和维度的矩阵,但是length要保证相等
参数order是’c’/’f’
用C样索引顺序读取/写入元素,最后一个轴索引变化最快,回到第一个轴索引变化最慢。'F'意味着使用Fortran样索引顺序读取/写入元素,第一个索引变化最快,最后一个索引变化最慢。
上面这个是numpy中reshape的Order参数的含义,在Nd4j中应该雷同
permute/permutei
改变矩阵中维度的顺序
transpose/transposei
转置
linearView
返回展开成一维矩阵
矩阵的拼接
方法
用法
Nd4j.hstack
横向拼接矩阵(row相同)
Nd4j.vstack
纵向拼接矩阵(column相同)
concat
指定维度拼接
concat(int dimension, INDArray... toConcat)
矩阵的叉乘以及元素运算等
方法
用法
mmul
矩阵叉乘,注意两个相乘矩阵的行列对应关系。前者的列数等于后者的行数
BooleanIndexing.and/or
通过传入函数以及范围来返回bool值对矩阵元素进行判断
BooleanIndexing.applyWhere/replaceWhere
对满足条件的矩阵中的值进行替换或其他操作
max/min/sum
amax
指定维度的max、min、sum等
前面加a是absolute绝对值的意思
sigmond/abs/tanh/exp/sqrt/log等
相应的函数值,都是常用的计算函数