理解多维矩阵的"求和"、"平均"操作确实太恶心了,numpy提供的函数里还有一堆参数,搞得晕头转向的,这里做个笔记,提醒一下自己, 下面是例程
import numpy as npX = np.array([[1, 2], [4, 5], [7, 8]])PRint np.mean(X, axis=0, keepdims=True)print np.mean(X, axis=1, keepdims=True)结果是分别是
[[ 1.5] [[ 4. 5.]] [ 4.5] [ 7.5]]我个人比较raw的认识就是,axis=0,那么输出矩阵是1行,求每一列的平均(按照每一行去求平均);axis=1,输出矩阵是1列,求每一行的平均(按照每一列去求平均)。还可以这么理解,axis是几,那就表明哪一维度被压缩成1。
再举个更复杂点的例子,比如我们输入为batch = [128, 28, 28],可以理解为batch=128,图片大小为28×28像素,我们相求这128个图片的均值,应该这么写
m = np.mean(batch, axis=0)输出结果m的shape为(28,28),就是这128个图片在每一个像素点平均值。
版权声明:本文为博主原创文章,未经博主允许不得转载。
Numpy简介
Numpy(Numerical Python的简称)是高性能科学计算和数据分析的基础包。其部分功能如下:
①ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组。 ②用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 ③用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 ④线性代数、随机数生成以及傅里叶变换功能。⑤用于集成由C、C++、Fortran等语言编写的代码的工具。
创建数组
创建数组最简单的办法是使用array函数。它接受一切序列型的对象(包括其他数组),然后产生一个新的含有传入数据的NumPy数组。以一个列表的转换为例:
[python] view plain copy data1=[6,7.5,8,0,1] #创建列表 arr1=np.array(data1) #转换为数组 arr1.dtype #数据类型保存在dtype对象中 data2=[[1,2,3,4],[5,6,7,8]] #创建嵌套序列(由等长列表组成的列表) arr2=np.array(data2) #转换为多维数组 np.zeros(10) #创建指定长度(10)的全0数组 np.ones((3,6)) #创建指定长度的(3行6列二维)的全1数组 range(10) #创建指定数量的顺序列表(内置函数,默认0开始) arange(10) #创建指定数量的顺序数组 eye(10) #创建一个正方的N×N单位矩阵 arr1=np.array([1,2,3],dtype=np.float64) #解释为特定数据类型 %20 数组和标量之间的运算[python] view%20plain copy arr=np.array([[1.,2.,3.],[4.,5.,6.]]) #创建二维数组 arr*arr #行列号相同的数组元素间运算 arr-arr 1/arr arr*0.5 %20 基本的索引与切片[python] view%20plain copy arr=np.arange(10) arr[5] #索引第6个元素 arr[5:8] #索引第6到第9个元素作为数组 arr[5:8]=12 #令第6到第9个元素等于12 arr_slice=arr[5:8] #数组切片是原始数据的视图,视图上的任何修改都会反映到原数组 arr_slice[:]=64 #将数组切片的全部元素改为64 arr[5:8].copy() #得到数组切片的一份副本 arr2d=np.array([[1,2,3],[4,5,6],[7,8,9]]) arr2d[2] #索引二维数组第3行 arr2d[0][2] arr2d[0,2] #等价索引1行3列元素 arr2d[:2] #索引第1行和第2行(不含第3行) arr2d[:,:1] #索引第1列 arr2d[:-2] #使用负数索引将从尾部开始选取行 %20 数组转置和轴对换 %20 转置(transpose)是重塑的一种特殊形式,它返回的是源数据的视图(不会进行复制操作)。[python] view%20plain copy arr=np.arange(15).reshape((3,5)) #生成顺序数组,后整形为3行5列 arr.T #转置 arr=np.random.randn(6,3) #randn函数生成一些正态分布的随机数组(6行3列) np.dot(arr.T,arr) #利用np.dot计算矩阵内积XTX %20 通用函数:快速的元素级数组函数%20 %20通用函数(即ufunc)是一种对ndarray中的数据执行元素级运算的函数。
[python] view%20plain copy arr=np.arange(10) np.sqrt(arr) #计算各元素的平方根(arr**0.5) exp #计算各元素指数ex; abs #绝对值; np.add(x,y) #x、y数组中对应元素相加; subtract #相减; multiply #相乘; divide #相除; 利用数组进行数据处理用数组表达式代替循环的做法,通常称为矢量化 将条件逻辑表述为数组运算
Numpy.where函数是三元表达式x if condition else y的矢量化版本
[python] view plain copy xarr=np.array([1.1,1.2,1.3,1.4,1.5]) #两个数值数组 yarr=np.array([2.1,2.2,2.3,2.4,2.5]) cond=np.array([True,False,True,True,False]) #一个布尔数组 result=np.where(cond,xarr,yarr) #三元表达式 %20 数学和统计方法 %20 %20可以通过数组上的一组数学函数对整个数组或某个轴向的数据进行统计计算。Sum、mean以及标准差std等聚合计算(aggregation,通常叫做约简(reduction))既可以当做数组的实例方法调用,也可以当做顶级NumPy函数使用:[python] view%20plain copy arr=np.random.randn(5,4) arr.mean(); np.mean(arr); arr.sum(); arr.mean(axis=1) #计算该轴上的统计值(0为列,1为行) %20 用于布尔型数组的方法 %20 %20布尔值会被强制转换为1(True)和0(False)。因此,sum经常被用来对布尔型数组中的True值计数:[python] view%20plain copy arr=randn(100) (arr>0).sum() #正值的数量 bools.any() #用于测试数组中是否存在一个或多个True bools.all() #用于测试数组中所有值是否都是True %20 排序 %20 %20跟Python内置的列表类型一样,NumPy数组也可以通过sort方法就地排序(修改数组本身)。[python] view%20plain copy arr=randn(8) arr.sort() arr=randn(5,3) arr.sort(0) #二维数组按列排序; arr.sort(1) #二维数组按行排序; %20 唯一化[python] view%20plain copy ints=np.array([3,3,3,2,2,1,1,4,4]) np.unique(names) #找出数组中的唯一值并返回已排序的结果 %20 用于数组的文件输入输出 %20 %20Numpy能够读写磁盘上的文本数据或二进制数据。[python] view%20plain copy arr=np.arange(10) np.save(‘some_array’,arr) #数组以未压缩的原始二进制格式保存在.npy文件中 np.load(‘some_array’) #通过np.load读取磁盘上的数组 np.savez(‘array_archive.npz’,a=arr,b=arr) #将多个数组以保存在一个压缩文件中 a=np.arange(0,12,0.5).reshape(4,-1) np.savetxt(‘E://knakan//a.txt’,a) #缺省按照’%.18e’格式保存数据,以空格分隔 np.loadtxt(‘E://kankan//a.txt’) np.savetxt(‘E://kankan//a.txt’,a,fmt=”%d”,delimiter=”,”) #改为保存为整数,以逗号分隔 np.loadtxt(‘E://kankan//a.txt’,delimiter=”,”) #读入时也需指定逗号分隔 %20 线性代数[python] view%20plain copy x=np.array([[1.,2.,3.],[4.,5.,6.]]) y=np.array([[6.,23.],[-1,7],[8,9]]) x.dot(y) #矩阵乘法,相当于np.dot(x,y) 【参考文献】[1]. 利用Python进行数据分析,wes McKinney著,唐学韬译,2014年,机械工业出版社
新闻热点
疑难解答