python-numpy
1.常用概念
对象的副本或视图
NumPy中,尤其是在做数组运算或数组操作时,返回结果不是数组的副本就是视图。NumPy中,所有赋值运算不会为数组和数组中的任何元素创建副本。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#数组赋值实际上不是为a创建副本
a = np.array([1,2,3,4])
b = a
b
# array([1,2,3,4])
a[2] - 0
b
# array([1,2,0,4])
#数组切片操作返回的对象只是原数组的视图
c = a[0:2]
c
# array([1,2])
a[0] = 0
c
# array([0,2])切片操作得到的结果,实际上仍指向相同的对象。如果想为原数组生成-份完整的副本,从而得到一个不同的数组,使用copy()函数即可。
向量化
向量化和广播这两个概念是NumPy内部实现的基础。有了向量化,编写代码时无需使用显式循环。这些循环实际上不能省略,只不过是在内部实现,被代码中的其他结构代替。向量化的应用使得代码更简洁,可读性更强。
1
2# NumPy中两个数组相乘可以表示为:
a * b广播机制
广播机制这一操作实现了对两个或以上数组进行运算或用函数处理,即使这些数组形状并不完全相同。并不是所有的维度都要彼此兼容才符合广播机制的要求,但它们必须要满足一定的条件。
广播机制满足条件:两个数组的各维度兼容,也就是两个数组的每一维等长,或其中一个数组为一维。如果这两个条件都不能满足,NumPy就会抛出异常,说两个数组不兼容。
规则:第一条是为缺失的维度不上个1;第二条是假定缺失元素(一维)都用已有的值进行填充
2.结构化数组
它包含的是结构或记录而不是独立的元素。
创建一个简单的结构化数组,其中元素为结构体。你可以用dtype选项,指定一系列用逗号隔开的说明符,指明组成结构体的元素及它们的数据类型和顺序。
1 | structured = np.array([(1,'First',0.5,1+2j),(2,'Second', 1.3,2-2j),(3,'Third', o.8,1+3j)],dtype=('i2,a6,f4,c8')) |
自动赋给结构体每个元素的名称可以看成数组列的名称。用它们作为结构化索引,就能引用类型相同或是位于同列的元素。
1 | structured[ 'f1'] |
4.数组数据文件的读写
NumPy提供了几个函数,数据分析师可用其把结果保存到文本或二进制文件中。类似地,NumPy还提供了从文件中读取数据并将其转换为数组的方法。
二进制文件的读写
NumPy的save()方法以二进制格式保存数据,load()方法则从二进制文件中读取数据。
假如你有一个数组要保存,例如数据分析过程产生的结果,调用save()函数即可,参数有两个 : 要保存到的文件名和要保存的数组,其中文件名中的.npy扩展名系统会自动添加。
1
2
3
4
5
6data
#array([[ 0.86466285, 0.76943895,0.22678279],
#[ 0.12452825,0.54751384,0.06499123],
#[ 0.06216566,0.85045125,0.92093862],
#[0.58401239,0.93455057,0.28972379]])
np.save( 'saved _data',data)若要恢复存储在.npy文件中的数据,可以使用load()函数,用文件名作为参数,这次记得添加.npy扩展名。
1
2
3
4
5
6
7# 若要恢复存储在.npy文件中的数据,可以使用load()函数,用文件名作为参数,这次记得添加.npy扩展名。
loaded_data = np.load(' saved_data.npy ')
loaded data
#array([[0.86466285,0.76943895,0.22678279],
# [0.12452825,0.54751384,0.06499123],
# [0.06216566,0.85045125,0.92093862],
# [o.58401239,0.93455057,0.28972379]])读取文件中的列表形式数据
NumPy的genfromtxt()函数可以从文本文件中读取数据并将其插入数组中。通常而言,这个函数接收三个参数:存放数据的文件名、用于分割值的字符和是否含有列标题。在接下来这个例子中,分隔符为逗号
1
2
3data = np.genfromtxt('data.csv',delimiter=',' ,names=True)
data
#array([(1.0,123.0,1.4,23.0),(2.0,110.0,0.5,18.0),(3.o,164.0,2.1,19.0)],dtype=[('id', '<f8'),( 'value1', '<f8'),( 'value2 ' , 'if8'),( 'value3', '<f8')])从输出结果可以看到,我们得到了一个结构化数组,各列的标题变为各字段的名称。这个函数其实包含两层隐式循环:第一层循环每次读取一行;第二层循环将每一行的多个值分开后,再对这些值进行转化,依次插入所创建的元素。这个函数的优点是它能处理文件中的缺失数据。
genfromtxt()是怎样把内容为空的项填充为nan值的。