NumPy学习笔记(二)

Author Avatar
Brian Lee 3月 17, 2018
  • 在其它设备中阅读本文章

内容承接Numpy学习笔记(一)


CSV文件

CSV(Comma-Separated Value,逗号分隔值)是一种文件格式,用来存储批量数据

数据写入CSV文件

np.savetxt(frame, array, fmt='%.18e', delimiter=',')
  • frame:要存入的文件、字符串或产生器,可以是 .gz 或 .bz2 的压缩文件,如“D:/a.csv”
  • array:存入文件的数组
  • fmt:写入文件的格式,例如:%d %.2f %.18e
  • delimiter:分割字符串,默认是空格,使用CSV文件应用逗号

数据从CSV文件读出

np.loadtxt(frame, dtype=np.float, delimiter=',', unpack=False)
  • frame:文件、字符串或产生器,可以是.gz或.bz2的压缩文件
  • dtype:数据类型,可选(将CSV文件中的字符串变成此格式)
  • delimiter:分割字符串,默认是任何空格
  • unpack:若为True,读入属性将分别写入不同变量。若为False,读入数据写入一个数组。

CSV文件局限性

CSV只能有效存储一维和二维数组

np.savetxt() 和 np.loadtxt()只能有效存取一维和二维数组


任意维度数据存取

存入文件

a.tofile(frame, sep='', format='%s')
  • frame:文件、字符串
  • sep:数据分割字符串,如果是空串(即不指定分隔符),写入文件为二进制
  • format:写入数据的格式

这种存储方式忽略了维度,只是将数组中元素逐一列出并输入到文件中。例如:

a.tofile("b.dat", sep=",", format='%d')

从文件读出

np.fromfile(frame, dtype=float, count=‐1, sep='')
  • frame:文件、字符串
  • dtype:读取的数据类型,默认是float
  • count:读入元素个数,‐1表示读入整个文件
  • sep:数据分割字符串,如果是空串,写入文件为二进制

例如:

c = np.fromfile("b.dat", dtype=np.int, sep=',')

但此时c是一个按顺序存储了所有元素的一维数组,接下来调用reshape()函数便可以得到想要的格式。

注意

该方法需要读取时知道存入文件时数组的维度和元素类型

写一个文件,将要存储的数组的每个元素的类型与维度作为元信息存储起来

a.tofile() 和 np.fromfile()需要配合使用

便捷文件存取

np.save(fname, array)    #存入文件
a = np.load(fname)        #从文件读出
  • fname:文件名,以.npy为扩展名,压缩扩展名为.npz(NumPy自定义文件)
  • array:数组变量

随机数函数

NumPy的random子库

为数组类型提供随机数相关功能

函数 说明
rand(d0,d1,..,dn) 根据d0‐dn创建随机数数组,[0,1)浮点数,均匀分布
randn(d0,d1,..,dn) 根据d0‐dn创建随机数数组,标准正态分布
randint(low,high,shape) 根据shape创建随机整数或整数数组,范围是[low, high)
seed(s) 随机数种子,s是给定的种子值,同一seed生成的随机数相等
shuffle(a) 根据数组a的第1轴(axis=0)进行随排列,改变数组a
permutation(a) 根据数组a的第1轴产生一个新的乱序数组,不改变数组a
choice(a,size,replace,p) 从一维数组a中以概率p抽取元素,形成size形状新数组,replace表示是否可以重用元素,默认为True,表示可重复使用
uniform(low,high,size) 产生具有均匀分布的数组,low起始值,high结束值,size形状
normal(loc,scale,size) 产生具有正态分布的数组,loc均值,scale标准差,size形状
poisson(lam,size) 产生具有泊松分布的数组,lam随机事件发生率,size形状

使用示例:

a = np.random.rand(3, 4, 5)    #产生均匀分布的3*4*5随机数组
b = np.random.randn(3, 4, 5)    #产生正态分布的3*4*5随机数组
c = np.random.randint(100, 200, (3, 4))    #产生3*4整数随机数组,整数取值[100,200)
np.random.seed(10)    #设置随机数种子为10,此后使用randint()产生的随机数组一样
np.random.shuffle(a)    #以axis=0将a随机排列,a变化
b = np.random.permutation(a)    #以axis=0将a随机排列,a不变
np.random.choice(b, (3, 2), replace=False)    #生成3*2数组,值为b中元素,不可重复使用
np.random.choice(b, (3, 2), p=b/np.sum(b))    #生成3*2数组,值为b中元素,产生概率根据p
u = np.random.uniform(0, 10, (3, 4))    #生成3*4均匀分布数组
n = np.random.normal(10,5,(3, 4))    #生成3*4正态分布数组

统计函数

函数 说明
sum(a, axis=None) 根据给定轴axis计算数组a相关元素之和,axis整数或元组
mean(a, axis=None) 根据给定轴axis计算数组a相关元素的期望,axis整数或元组
average(a,axis=None,weights=None) 根据给定轴axis计算数组a相关元素的加权平均值
std(a, axis=None) 根据给定轴axis计算数组a相关元素的标准差
var(a, axis=None) 根据给定轴axis计算数组a相关元素的方差
min(a) max(a) 计算数组a中元素的最小值、最大值
argmin(a) argmax(a) 计算数组a中元素最小值、最大值的降一维后下标
unravel_index(index, shape) 根据shape将一维下标index转换成多维下标
ptp(a) 计算数组a中元素最大值与最小值的差
median(a) 计算数组a中元素的中位数(中值)

使用示例:

np.sum(a)    #求数组a中所有元素的和
np.mean(a, axis=1)    #求数组啊第二维的平均值
np.average(a, axis=0, weight=[10, 5, 1])    #求数组a第一维的加权平均
np.std(a)    #求数组a的标准差
np.var(a)    #求数组a的方差
np.max(b)    #数组b的最大值
np.argmax(b)    #数组b扁平化下标
np.unravel_index(np.argmax(b), b.shape)    #重塑成多维下标
np.ptp(b)    #数组b的最大值与最小值的差
np.median(b)    #数组b中位数

此部分详细理解与示例见另一篇博客:Numpy轴与统计函数


梯度函数

梯度:连续值之间的变化率,即斜率

XY坐标轴连续三个X坐标对应的Y轴值:a, b, c,其中,b的梯度是: (c‐a)/2(有两侧值)

c的梯度是:(c-b)/1(无两侧值)

二维数组的梯度存在两个方向,所以产生两个二维的梯度矩阵,第一个表示最外层维度的梯度,第二个表示第二层维度的梯度。多维数组同理。

函数 说明
np.gradient(f) 计算数组f中元素的梯度,当f为多维时,返回每个维度梯度

用处:反映了元素的变化率,尤其在进行图像、声音批量数据处理的时候,梯度有助于发现图像和声音的边缘

本博客采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!
本文链接:http://brianleelxt.top/2018/03/17/numpy-learn2/