张量(tensor)其实是离散数学中的概念,有着清晰严格的定义,不过也很深奥,这里我们仅从程序员的角度简单理解一下。比如单个数字可以看做是0阶张量,一维数组就是1阶张量,二维数组(矩阵)就是2阶张量,依此类推。可以发现,张量是由一定规的数据集,有很好的抽象能力,能很好的刻画对象。比如对于个人,健康指标可以用0~1来表示,为0阶张量。健康状态可以用数组表示,分别为体重指标,身高指标,肺活量指标等,为1阶张量,还可以再加入纵轴,比如年龄,性别等,构成健康图谱,成为2阶张量。
好了,numpy就是python中处理n-demensional array, 也就是ndarray,非常方便,而ndarray在和tensorflow的tensor大同小异,可以相互转换,在这里可以统称为张量。那么如何计算张量的形状呢?
tensor = [[12,2,2,3],
[4,34,54,34]
]
比如上图,tensor是4*2张量,还是2*4呢?也即写成shape=[4,2],还是[2,4],是不是都可以,还是只有一种合理的方法?这和我们访问多维数组的习惯有很大的关系,比如在for循环中,我们都是从最外层开始访问的,那么最外层的就应该是shape的第一位
for (let arr in tensor){
for(let a in arr){
print(a);
}
}
和用shape的方式访问等价:
for( let i=0;i++;i<shape[0]){
for(let j=0;i++;j<shape[1]){
print(tensor[i][j]);
}
}
所以其形状为2*4。在计算张量的形状时,可以把张量看成数组的嵌套,从外到里访问,分别是shape的1维,2维,...n维。
下面我们看下其api的使用。
1、就像0和其他自然数有很大不同,0阶张量和n阶张量(n>0)的api也有很大区别,比如下面。
- np.max:(a, axis=None, out=None, keepdims=False)
- 求序列的最值
- 最少接收一个参数
- axis:默认为列向(也即 axis=0),axis = 1 时为行方向的最值;
- np.maximum:(X, Y, out=None)
- X 与 Y 逐位比较取其大者;
- 最少接收两个参数
2、张量元素的迭代器
在python中,创建一个一维数组的迭代器是非常简单的,使用也很简单,但是在对于多维,就有很多参数,如下
it=np.nditer(a,flags=['multi_index'],op_flags=['readwrite'])
这句话看起来不好理解,我们来仔细研究下。
flags=['multi_index']
表示对a进行多重索引,具体解释看下面的代码。 op_flags=['readwrite']
表示不仅可以对a进行read(读取),还可以write(写入),即相当于在创建这个迭代器的时候,我们就规定好了有哪些权限。
3、张量的卷积运算
从二维张量(矩阵)的角度看,张量的卷积运算是对dot product和cross运算的一种推广,对两个矩阵的形状没有那么严格的要求,可以试想两个平面运算,两个方块运算。
4、numpy.pad填充函数:
看这篇博客,写的很详细,有案例,
5、张量中的切片操作:
x1=np.random.rand(3,4,5)
x2 =x1[:,2,:]:确定了第二个轴的坐标,没有用冒号代替,意思就是全选,则x2,shape=(3,5),就相当于在面包上切片,非常方便。
7,ndarray的方法和属性
Numpy中主要处理ndarray,当我们把处理好的数据集变成ndarray后,那它将拥有哪些方法和函数呢?比如最常见的shape和reshape(),transpose()。这些可以分为描述信息和统计信息两大类吧,比如mean(),std(),还有很多api,可以去看下官方文档。
8、python标准库中的math和numpy中的数学计算问题:
比如都有math.exp()和numpy.exp()函数等,但是做数据分析时一般都用numpy自带的数学函数,更专业
参考资料:
numpy官方参考文档
日进有功