一、关于NumPy的介绍:
NumPy是Numerical Python的缩写,是python数值计算的基石。它提供多种数据结构、算法以及大部分涉及Python数值计算所需的接口。NumPy还包括其他内容:
- 快速、高效的多维数组对象ndarray
- 基于元素的数组计算或数组间数学操作函数
- 用于读写硬盘中基于数组的数据集的工具
- 线性代数操作、傅立叶变换以及随机数生成
- 成熟的C语言API,允许Python拓展和本地的C或C++代码访问NumPy的数据结构和计算设施
除了NumPy赋予Python的快速数组处理能力以外,NumPy的另外一个主要的用途在算法和库之间作为数据传递的数据容器。对于数据数据,NumPy数组能够比Python内建数据结构更高效地存储和操作数据。此外,用底层语言编写的库,例如用C或Fortran编写的库,可以在NumPy数组存储的数据结构的数据上直接操作,而无须将数据复制到其他内存中后再操作。因此,许多Python的数值计算工具将NumPy数组作为基础数据结构,或与NumPy进行无缝互操作。
NumPy大多数被应用在数据分析上,能够对数据做一些处理,比如:数据处理、清洗、过滤等。除此之外,还可用于数据算法、统计等。
二、多维数组(NumPy ndarray):
NumPy的核心特征之一就是N-维数组对象——ndarray。ndarray是Python中一个快速、灵活的大型数据集容器。数据允许你使用类似于标量的操作语法在整块数据上进行数学计算。
1、创建数组
在此之前,我们使用标准的NumPy导入的方式import numpy as np。你当然也可以使用其他的方式导入,然而我还是建议使用标准导入的方式。
创建数组的方式有以下两种,所创建的数组维度是有区别的。
第一种方式:使用array函数。array函数接收任意的序列型对象(当然包括数组),生成一个新的包含传递数据的NumPy数组。例如:
# 使用NumPy的标准导入方式导入numpy库
import numpy as np
# 创建数组方式一:使用array函数
my_list1 = [1, 2, 3, 4, 5, 6]
my_data1 = np.array(my_list1)
my_data1
# 运行结果:
# array([1, 2, 3, 4, 5, 6])
嵌套序列,例如等长度的嵌套列表,将自动转换成多位数组:
# 使用NumPy的标准导入方式导入numpy库
import numpy as np
# 创建数组方式一:使用array函数,传入嵌套序列
my_list2 =[ [1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12]]
my_data2 = np.array(my_list2)
my_data2
# 运行结果:
# array([[ 1, 2, 3, 4, 5, 6],
# [ 7, 8, 9, 10, 11, 12]])
第二种方式:利用np.arange创建,返回一个数组结果,使用该方法只能创建一维数组,但是我们可是使用reshape方法将其转化为多维数组。
# 使用NumPy的标准导入方式导入numpy库
import numpy as np
# 创建数组方式二:利用np.arange创建
data = np.arange(10)
data
# 运行结果:
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# 通过reshape变形其排列方式,转化为多位数组
data = np.arange(10).reshape(3,3)
# 运行结果:
# array([[0, 1, 2, 3, 4],
# [5, 6, 7, 8, 9]])
一般采用 np.arange().reshape() 来创建多维数组,比较方便快捷。在创建时,使用元组或者列表都是可行的,即小括号中括号是没有区别的,都能达到创建数组的目的。
除了np.array,还有很多其他函数可以创建新数组,例如,给定长度及形状后,zeros可以一次性创建全0的数组,ones可以一次性创建全1的数组。empty则可以创建一个没有初始化数值的数组。
# 使用NumPy的标准导入方式导入numpy库
import numpy as np
# 全0的数组
data1 = np.zeros(10)
data1
# 运行结果:
# array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
# 全1的数组
data2 = np.zeros(10)
data2
# 运行结果:
# array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
# 没有初始值的数组
data3 = np.empty((2, 3, 2))
data3
# 运行结果:
# array([[[0.00000000e+000, 2.00000013e+000],
# [2.96439388e-323, 0.00000000e+000],
# [4.57668571e-072, 2.46567317e+179]],
# [[6.20015184e-091, 1.48575047e-076],
# [1.26863781e-076, 3.22179210e-057],
# [3.99910963e+252, 8.57853230e-309]]])
# 指定值的数组
data4 = np.full((2, 3), 2)
data4
# 运行结果:
# array([[2, 2, 2],
# [2, 2, 2]])
使用np.empty来生成全0的数组并不安全,有时候可能会返回为初始化的垃圾数据。
2、数组常用属性:
shape方法:可用来查看数据的维度信息
# 使用NumPy的标准导入方式导入numpy库
import numpy as np
data = np.arange(20).reshape(4,5)
# shape方法:可用来查看数据的维度信息
data.shape
# 运行结果:
# (4, 5)
size方法:可以查看数组元素的个数
# 使用NumPy的标准导入方式导入numpy库
import numpy as np
data = np.arange(20).reshape(4,5)
# size方法:可以查看数组元素的个数
data.size
# 运行结果:
# 20
dtype方法:可以查看数组的数据类型,数据类型的显示会因Ipython版本的不同而有所差异。
# 使用NumPy的标准导入方式导入numpy库
import numpy as np
data = np.arange(20).reshape(4,5)
# dtype方法:可以查看数组的数据类型,数据类型的显示会因Ipython版本的不同而有所差异。
data.dtype
# 运行结果:
# dtype('int64')
数据类型:
NumPy中默认的数据类型是float64。
下面是numpy支持的数据类型:
bool 用一位存储的布尔类型(值为 TRUE 或 FALSE )
inti 由所在平台决定其精度的整数(一般为 int32 或 int64 )
int8 整数,范围为128至127
int16 整数,范围为-32768至32767
int32 整数,范围为-2^31 至2^31-1
int64 整数,范围为-2^63 至2^63-1
uint8 无符号整数,范围为0至255
uint16 无符号整数,范围为0至65535
uint32 无符号整数,范围为0至2^32-1
uint64 无符号整数,范围为0至2^64 -1
float16 半精度浮点数(16位):其中用1位表示正负号,5位表示指数,10位表示尾数
float32 单精度浮点数(32位):其中用1位表示正负号,8位表示指数,23位表示尾数
float64 或 float 双精度浮点数(64位):其中用1位表示正负号,11位表示指数,52位表示尾数
complex64 复数,分别用两个32位浮点数表示实部和虚部
complex128 或 complex 复数,分别用两个64位浮点数表示实部和虚部
在创建数组时,我们可以自己设定数组数据类型,如果不设定,Numpy会根据所创建得内容自行判断数据类型。例如:
# 使用NumPy的标准导入方式导入numpy库
import numpy as np
data = np.arange(20).reshape(4,5)
data.dtype
# 运行结果:
# dtype('int64')
创建数组时设定numpy指定的数据类型,只需设定参数 dtype='数据类型',通常如果没有特别要求或者对数据的存储类型不限定时,不用特别强调数据类型。
# 使用NumPy的标准导入方式导入numpy库
import numpy as np
data = np.arange(20, dtype='int32').reshape(4,5) # 设定参数 dtype='数据类型'
data.dtype
# 运行结果:
# dtype('int32')
数组的数据类型之间是可以转换的,可以使用以下两种方法:
# 使用NumPy的标准导入方式导入numpy库
import numpy as np
# 方式一:
data = np.arange(20, dtype='int32').reshape(4,5)
data.dtype
# 运行结果:
# dtype('int32')
# 方式二:
data1 = np.arange(20, dtype='int32').reshape(4,5)
data1.dtype = 'float64'
data1.dtype
# 运行结果:
# dtype('float32')