【基本工具】S02E01 NumPy 函数包使用方法初步

0.本集概览

1.NumPy数据类型的优势概述
2.ndarray多维数组的创建与基本属性
3.网格数据和范围数据的创建
4.ndarray多维数组的维度转换、连接与标量计算

通过第一季的学习,我们全面接触了Python这门有趣、有用的语言。做到了核心内容全覆盖,并且具备了一定的深度。相信掌握了他们,你已经跃跃欲试,想做点什么了,对吗?

1.NumPy概述

在这一季里,我们主要学习Python数据分析的一些常用的基本工具。我们首先要接触的是NumPy这个函数包,NumPy是Numerical Python的简写,是高性能科学计算和数据分析的基础包,他是许多高级工具的构建基础。

他的核心功能是:
1.多维向量的描述和快速高效计算能力,让数组和矩阵的使用更加自然;
2.大量实用的数学函数,支撑复杂的线性代数、随机数生成以及傅里叶变换函数
3.具备数据的磁盘读写工具

请大家回忆一下,上一季里介绍Python语言的时候,Python的内置容器List似乎也有上述类似功能啊的确如此,那我们为啥还要另起炉灶呢,原因很简单:1、编程更简单;2、计算更快捷。

对于同样的数值计算任务,使用NumPy要比直接编写Python代码便捷的多。这是因为NumPy能够直接对数组和矩阵进行操作,可以省略很多循环语句,其众多的数学函数也会让编写代码的工作轻松许多。同时底层算法在设计时有着优异的的性能,NumPy中数组的存储效率和输入输出性能均远远优于Python中等价的基本数据结构,如嵌套list

2.核心对象:ndarray多维数组

我们首先来看看NumPy中描述N维数组的核心对象,ndarray。该对象是一个快速而灵活的大数据集容器。

使用NumPy工具需要使用NumPy函数包,因此在程序的起始处需要导入NumPy函数包,并约定俗成的将其简写为np。

2.1.ndarray对象创建

我们先来用Python的list对象来创建一个一维ndarray对象:
代码片段:

import numpy as np  

data = [1,2.11,4,59] 
arr = np.array(data) 
print(arr) 
print(type(arr)) 

运行结果:

 [  1.     2.11   4.    59.  ] 
<class 'numpy.ndarray'>

当然,这两种类型的对象是可以相互转换的,向量到Python内置list类型的转换:
代码片段:

import numpy as np  

arr = np.arange(8) 
L = arr.tolist() 
print(type(L)) 
print(L)  

运行结果:

<class 'list'> 
[0, 1, 2, 3, 4, 5, 6, 7]

再用嵌套列表构建一个ndarray多维数组:

同时,我们还可以获取这个多维数组的基本属性:维数、形状和判定合适的数据类型,如果没有显式指定数据类型,np.array在构建数组时会给新建的数组推断出一个合适的数据类型,这里依照数据成员8.2,定的数据类型为标准64位浮点类型float64。
代码片段:

import numpy as np  

data = [[1,2,3,4],[5,6,7,8.2]] 
arr = np.array(data) 
print(arr) 
print(arr.ndim) 
print(arr.shape) 
print(arr.dtype) 
print(type(arr))  

运行结果:

[[ 1.   2.   3.   4. ]  
[ 5.   6.   7.   8.2]] 
2 
(2, 4) 
float64 
<class 'numpy.ndarray'>

其中,ndim就是数组的维数:
data.ndim = len(data.shape)

2.2.数据类型

当然,我们可以对数据类型进行显式的指定,标准的双精度浮点数为8字节,64位,因此该类型在np中记作float64,同理32位整形数记作被记作int32。

不仅在初始化数组时可以指定数据类型,同时可以对已有的ndarray数组进行数据类型的显式转换。注意调用astype会创建一个新的数组,即原始数据的一个深拷贝。
代码片段:

import numpy as np  

arr1 = np.array([1,2,3,4], dtype=np.float64) 
arr2 = np.array([1,2,3,4], dtype=np.int32) 
arr3 = arr2.astype(np.float64)  
print(arr1) 
print(arr2) 
print(arr3)  

运行结果:

[ 1.  2.  3.  4.] 
[1 2 3 4] 
[ 1.  2.  3.  4.]

我们看到arr2在创建ndarray数组时,显式指定了元素类型为int32,后续又通过astype进行数据类型的显式转换,创建了新的数组arr3,其数据类型为float64浮点型。

2.3.特殊形状数组

还可以创建全0(zeros),全1(ones),及没有具体值的(未经过初始化的垃圾值)数组(empty),传入的参数是一个表示形状的元组:
代码片段:

import numpy as np  

arr_0 = np.zeros(8) 
arr_1 = np.ones((3, 8)) 
arr_e = np.empty((2,3,2)) 
print(arr_0) 
print(arr_1) 
print(arr_e)  

运行结果:

[ 0.  0.  0.  0.  0.  0.  0.  0.]  

[[ 1.  1.  1.  1.  1.  1.  1.  1.]  
 [ 1.  1.  1.  1.  1.  1.  1.  1.]  
 [ 1.  1.  1.  1.  1.  1.  1.  1.]]  

[[[  2.05931344e-316   1.87072344e-316]   
  [  1.85828998e-316   1.98442969e-316]   
  [  1.85755284e-316   1.70134311e-316]]   
 [[  1.71304417e-316   2.37875336e-316]   
  [  1.84704347e-316   1.70132375e-316]   
  [  2.46176627e-316   2.34552329e-316]]]

3.数据范围及网格数据

3.1.range指定范围

同理,之前我们讲过Python内置函数中有一个range函数,np中也有一个类似的函数实现该功能
代码片段:

import numpy as np  

arr1 = np.arange(8) 
print(arr1) 
print(type(arr1))  

运行结果:

[0 1 2 3 4 5 6 7] 
<class 'numpy.ndarray'>  

代码片段:

import numpy as np  

arr2 = np.arange(0,11,2,dtype=float) 
print(arr2)  

运行结果:

[  0.   2.   4.   6.   8.  10.]

3.2.生成网格数据

还有一种网格数据的生成方法:即指定起始点和终止点(包含),以及网格点的个数
代码片段:

import numpy as np  

arr = np.linspace(0,80,5) 
print(arr)  

运行结果:

[  0.  20.  40.  60.  80.]

还有利用eye、identity来创建单位矩阵,后面涉及到线性代数的时候我们再谈

top Created with Sketch.