科学计算库NumPy
1、NumPy数组对象
1.1、NumPy特点
N维数组对象,即ndarry(别名array)对象,该对象具有矢量算术能力和复杂的广播能力,可以执行一些科学计算,ndarry对象拥有对高维数组的处理能力。
ndarray对象的常用属性:
属性 | 具体说明 |
---|---|
ndarray.ndim | 维度个数,也就是数组轴的个数,比如一维、二维等 |
ndarray.shape | 数组的维度,这是一个整数的元组,表示每个维度上数组的大小。例如,一个n行和m列的数组,它的shape属性为(n,m) |
ndarray.size | 数组元素的总个数,等于shape属性中元组元素的乘积 |
ndarray.dtype | 描述数组中元素类型的对象,既可以使用标准的Python类型创建或指定,也可以使用NumPy特有的数据类型来指定,比如int32,float64等 |
ndarray.itemsize | 数组的每个元素的字节大小,比如int32的数组有4个字节(32/8) |
data = np.arange(12).reshape(3,4) # 创建一个3行4列的数组
data.ndim # 数组的维度个数,输出结果2,表示二维数组
data.shape # 数组的维度,输出结果(3,4),表示3行4列
data.size # 数组元素的个数,输出结果12,表示总共12个元素
data.dtype # 数组元素的类型,输出结果dtype('int32'),表示元素类型都是int32
2、创建NumPy数组
data1 = np.array([1,2,3]) # 创建一个一维数组
data2 = np.array([[1,2,3],[4,5,6]]) # 创建一个二维数组
(1)通过zeros()函数创建元素值都为0的数组
np.zeros((3,4))
(2)通过ones()函数创建元素值都为1的数组
np.ones((3,4))
(3)通过empty()函数创建一个新的数组,该数组只分配了内存空间,它里面填充的元素都是随机的,默认为float类型
np.empty((5,2))
(4)通过arange()函数创建一个等差数组
np.arange(1,20,5)
注意:默认情况下,通过zeros()、ones()、empty()函数创建的数组中数据类型为float64
3、ndarray对象的数据类型
3.1、查看数据类型
通过name属性进行获取
data = np.array([[1,2,3],[4,5,6]])
data.dtype.name
注意:在默认情况下,64位Windows系统输出的结果为int32,64位Linux或Mac OS系统输出结果为int64
NumPy中常用的数据类型:
数据类型 | 含义 |
---|---|
bool | 布尔类型,值为True或False |
int8、unit8 | 有符号和无符号的8为整数(同理16位、32位、64位) |
float16 | 半精度浮点数16位(同理32位、64位) |
complex64 | 复数,分别用两个32位浮点数表示实部和虚部 |
complex128 | 复数,分别用两个64位浮点数表示实部和虚部 |
3.2、数据类型转换
ndarray对象的数据类型可以通过astype()方法进行转换
data = np.array([[1,2,3],[4,5,6]])
float_data = data.astype(np.float64) # 数据类型转换为float64
float_data.dtype
4、数组运算
4.1、矢量化运算
NumPy中,大小相等的数组之间的任何算数运算都会应用到元素级,即只用于位置相同的元素之间,所得的运算结果组成一个新的数组。
data1 = np.array([[1,2,3],[4,5,6]])
data2 = np.array([[1,2,3],[4,5,6]])
data1+data2
# 运算结果为:array([[2,3,6],[8,10,12]])
4.2、数组广播
数组在进行矢量化运算时,要求数组的形状是相等的。当形状不相等的数组执行算术运算的时候,就会出现广播机制,该机制会对数组进行扩展,使数组的shape属性值一样,这样就可以进行矢量运算了。
arr1 = np.array([[0],[1],[2],[3]])
arr1.shape # (4,1)
arr2 =np.array([1,2,3])
arr2.shape # (3,)
arr1 + arr2
# array([[1,2,3],[2,3,4],[3,4,5],[4,5,6]])
注意:广播机制实现了对两个或两个以上的数组运算,即使这些数组的shape不是完全相同的,只需要满足如下任意一个条件即可:
(1)数组的某一维度等长
(2)其中一个数组的某一维度为1
广播机制需要扩展维度小的数组,使得它与维度最大的数组的shape值相同,以便使用元素级函数或者运算符进行运算。
4.3、数组与标量间的运算
大小相等的数组之间的任何算术运算都会将运算应用到元素级,同样,数组与标量的算数运算也会将那个标量值传播到各个元素。当数组进行相加、相减、乘以或除以一个数字时,这些称为标量运算。标量运算会产生一个与数组具有相同数量的行和列的新矩阵,其原始矩阵的每个元素都被相加、相减等。
data1 = np.array([[1,2,3],[4,5,6]])
data2 = 10
data1 + data2
# 计算结果:array([[11,12,13],[14,15,16]])
5、ndarray的索引和切片
1、一维数组:
arr = np.arange(8) # 创建一个一维数组
arr[5] # 获取索引为5的元素
arr[3:5] # 获取索引为3~5的元素,但不包括5
arr[1:6:2] # 获取索引为1~6的元素,步长为2
2、二维数组:
arr2 = np.array([[1,2,3],[4,5,6],[7,8,9]]) # 创建二维数组
arr2[1] # 获取索引为1的元素 array([4,5,6])
arr2[0,1] # 获取第0行第1列的元素 2
arr2[:2] # array([1,2,3],[4,5,6])
arr2[0:2,0:2] # array([1,2],[4,5])
arr2[1,:2] # array([4,5])
6、数组的转置与轴对称
将数组中每个元素按照一定的规则进行位置变换,transpose()方法和T属性两种实现方式。例如:3行4列的二维数组,T属性转置后形成4行3列的新数组。
arr = np.arange(12).reshape(3,4)
# array([[0,1,2,3],[4,5,6,7],[8,9,10,11]])
arr.T # 使用T属性对数组进行转置
# array([0,4,8],[1,5,9],[2,6,10],[3,7,11])
7、NumPy通用函数
一元通用函数:
arr = np.array([4,9,16])
np.sqrt(arr) # 计算数组元素的平方根 array([2.0,3.0,4.0])
np.abs(arr) # 计算数组元素的绝对值 array([4,9,16])
np.square(arr) # 计算数组元素的平方 array([16,81,256])
二元通用函数:
x = np.array([12, 9, 13, 15])
y = np.array([11, 10, 4, 8])
np.add(x, y) # 计算两个数组的和 array([23,19,17,23])
np.subtract(x,y) # 计算两个数组的差 array([1,-1,9,7])
np.multiply(x, y) # 计算两个数组的乘积 array([132,90,52,120])
np.maximum(x, y) # 两个数组元素级最大值的比较 array(12,10,13,15)
np.greater(x,y) # 执行元素级的比较操作 array([True,False,True,True])
8、利用NumPy数组进行数据处理
8.1、将条件逻辑转为数组运算
NumPy的where()函数是三元表达式x if condition else y 的矢量化版本。
x = np.array([1,5,7])
y = np.array([2,6,8])
con = np.array([True,False,True])
np.where(con,x,y) # con为真时,取x值,反之,取y值 array([1,6,7])
8.2、数组统计运算
NumPy数组中与统计运算相关的方法:
方法 | 描述 |
---|---|
sum | 对数组中全部或某个轴向的元素求和 |
mean | 算术平均值 |
min | 计算数组中的最小值 |
max | 计算数组中的最大值 |
argmin | 表示最小值的索引 |
argmax | 表示最大值的索引 |
cumsum | 所有元素的累计和 |
cumprod | 所有元素的累计积 |
arr = np.arange(10)
arr.sum() # 求和 45
arr.mean() # 求平均值 4.5
arr.min() # 求最小值 0
arr.max() # 求最大值 9
arr.argmin() # 求最小值的索引 0
arr.argmax() # 求最大值的索引 9
arr.cumsum() # 计算元素的累计和 array([0,1,3,6,10,15,21,28,36,45])
arr.cumprod() # 计算元素的累计积 array([0,0,0,0,0,0,0,0,0,0])
8.3、数组排序
通过sort()函数实现从小到大排序
arr=np.array([[6,2,7],[3,6,2],[4,3,2]])
arr.sort() # array([[2,6,7],[2,3,6],[2,3,4]])
注意:使用sort()函数排序会修改数组本身,如果希望对某一轴上的元素进行排序,需将轴的编号传入sort()函数。
arr.sort(0) # array([[3,2,2],[4,3,2],[6,6,7]])
8.4、检索数组元素
all()函数全真为True,any()函数有真即为True。
arr = np.array([[1, -2, -7], [-3, 6, 2], [-4, 3, 2]])
np.any(arr > 0) # 判断是否有一个大于0 True
np.all(arr > 0) # 判断是否所有元素都大于0 False
8.5、唯一化及其他集合逻辑
一维数组中,unique()函数找出数组中的唯一值,并返回有序结果
arr = np.array([12, 11, 34, 23, 12, 8, 11])
np.unique(arr) # array([8,11,12,23,34])
in1d()函数判断元素是否存在数组中,返回布尔型数组
np.in1d(arr,[11,12])
# array([True,True,False,False,True,False,True])
数组集合运算的常见函数:
函数 | 描述 |
---|---|
unique(x) | 计算x中的唯一元素,并返回有序结果 |
intersect1d(x,y) | 计算x和y的交集,返回有序结果 |
union1d(x,y) | 计算x和y的并集,返回有序结果 |
in1d(x,y) | 返回一个“x的元素是否包含y”的布尔型数组 |
9、随机数模块
random模块的常见函数:
函数 | 描述 |
---|---|
seed | 生成随机数的种子 |
rand | 产生均匀分布的样本值 |
randint | 从给定的上下限范围内随机选取整数 |
normal | 产生正态分布的样本值 |
beta | 产生Beta分布的样本值 |
uniform | 产生在【0,1】中均匀分布的样本值 |
np.random.seed() # 生成随机数种子
np.random.rand(5) # 随机生成5个元素的浮点型数组
注意:seed()函数使随机数具有预见性,当传入的参数相同时,每次生成的随机数相同。