数组广播机制
对于 Numpy 来说,维度匹配当且仅当:
维度相同
有一个的维度是1
匹配会从最后一维开始进行,直到某一个的维度全部匹配为止,因此对于以下情况,Numpy 都会进行相应的匹配:
A | B | Result |
---|---|---|
3d array: 256 x 256 x 3 | 1d array: 3 | 3d array: 256 x 256 x 3 |
4d array: 8 x 1 x 6 x 1 | 3d array: 7 x 1 x 5 | 3d array: 8 x 7 x 6 x 5 |
3d array: 5 x 4 x 3 | 1d array: 1 | 3d array: 5 x 4 x 3 |
3d array: 15 x 4 x 13 | 1d array: 15 x 1 x 13 | 3d array: 15 x 4 x 13 |
2d array: 4 x 1 | 1d array: 3 | 2d array: 4 x 3 |
匹配成功后,Numpy 会进行运算得到相应的结果。
数组读写
- 从文本中读取数组
loadtxt 函数
loadtxt(fname, dtype=<type 'float'>,
comments='#', delimiter=None,
converters=None, skiprows=0,
usecols=None, unpack=False, ndmin=0)
loadtxt 有很多可选参数,其中 delimiter 就是刚才用到的分隔符参数。
skiprows 参数表示忽略开头的行数,可以用来读写含有标题的文本
使用 loadtxt 方法读取空格(制表符)分割的文本
使用 loadtxt 方法读取逗号分隔文件
In [10]:
%%writefile myfile.txt
-- BEGINNING OF THE FILE
% Day, Month, Year, Skip, Power
01, 01, 2000, x876, 13 % wow!
% we don't want have Jan 03rd
04, 01, 2000, xfed, 55
Overwriting myfile.txt
In [11]:
data = np.loadtxt('myfile.txt',
skiprows=1, #忽略第一行
dtype=np.int, #数组类型
delimiter=',', #逗号分割
usecols=(0,1,2,4), #指定使用哪几列数据
comments='%' #百分号为注释符
)
data
Out[11]:
array([[ 1, 1, 2000, 13],
[ 4, 1, 2000, 55]])
读写各种格式的文件
如下表所示:
文件格式 | 使用的包 | 函数 |
---|---|---|
txt | numpy | loadtxt, genfromtxt, fromfile, savetxt, tofile |
csv | csv | reader, writer |
Matlab | scipy.io | loadmat, savemat |
hdf | pytables, h5py | |
NetCDF | netCDF4, scipy.io.netcdf | netCDF4.Dataset, scipy.io.netcdf.netcdf_file |
文件格式 | 使用的包 | 备注 |
---|---|---|
wav | scipy.io.wavfile | 音频文件 |
jpeg,png,… | PIL, scipy.misc.pilutil | 图像文件 |
fits | pyfits | 天文图像 |
此外, pandas ——一个用来处理时间序列的包中包含处理各种文件的方法。
将数组写入文件
将数组写入文件 savetxt函数
savetxt(fname,
X,
fmt=’%.18e’,
delimiter=’ ‘,
newline=’\n’,
header=’’,
footer=’’,
comments=’# ')
Numpy 二进制格式
数组可以储存成二进制格式,
单个的数组保存为 .npy 格式,
多个数组保存为多个.npy文件组成的 .npz 格式,每个 .npy 文件包含一个数组。
与文本格式不同,二进制格式保存了数组的 shape, dtype 信息,以便完全重构出保存的数组。
保存的方法:
- save(file, arr) 保存单个数组,.npy 格式
- savez(file, *args, **kwds) 保存多个数组,无压缩的 .npz 格式
- savez_compressed(file, *args, **kwds) 保存多个数组,有压缩的 .npz 格式
读取的方法:
- load(file, mmap_mode=None) 对于 .npy,返回保存的数组,对于 .npz,返回一个名称-数组对组成的字典。
示例:
- 单个数组的读写
a = np.array([[1.0,2.0], [3.0,4.0]])
fname = 'afile.npy'
np.save(fname, a)
In [25]:
aa = np.load(fname)
aa
- 保存多个数组
a = np.array([[1.0,2.0],
[3.0,4.0]])
b = np.arange(1000)
np.savez('data.npz', a=a, b=b)
载入数据:data = np.load('data.npz')
载入后可以像字典一样进行操作:
list(data.keys()) #读取字典的关键字
data['a'] #读取关键字对应的值
data['b'].shape #读取b的维度