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
 6- data 
 #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
 3- data = 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值的。