科学计算库NumPy
我只是整理了一下黑马程序员的笔记,如有需要请购买正版图书
科学计算库NumPy
01 认识NumPy数组对象
ndarray对象中定义了一些重要的属性
02 创建NumPy数组
创建NumPy数组
1.最简单的创建ndarray对象的方式是使用array()函数,在调用该函数时传入一个列表或者元组
#创建一个一维数组
data1 = np.array([1, 2, 3])
#创建一个二维数组
data2 = np.array([[1, 2, 3], [4, 5, 6]])
2.通过zeros()函数创建元素值都是0的数组;通过ones()函数创建元素值都为1的数组
#创建元素值全是0的数组
np.zeros((3, 4))
#创建元素值全是1的数组
np.ones((3, 4))
3.通过empty()函数创建一个新的数组,该数组只分配了内存空间,它里面填充的元素都是随机的
#创建元素值全是随机数的数组
np.empty((5, 2))
4.通过arange()函数可以创建一个等差数组,它的功能类似于range(),只不过arange()函数返回的结果是数组,而不是列表
np.arange(1, 20, 5)
注:大家可能注意到,有些数组元素的后面会跟着一个小数点,而有些元素后面没有,比如1和1.,产生这种现象,主要是因为元素的数据类型不同所导致的
03 ndarray对象的数据类型
查看数据类型
ndarray.dtype可以创建一个表示数据类型的对象,如果希望获取数据类型的名称,则需要访问name属性进行获取
data_one = np.array([[1, 2, 3], [4, 5, 6]])
data_one.dtype.name
NumPy的数据类型是由一个类型名和元素位长的数字组成
1.通过zeros()、ones()、empty()函数创建的数组,默认的数据类型为float64。
2.默认情况下,64位windows系统输出的结果为int32, 64位Linux或macOS系统输出结果为int64,当然也可以通过dtype来指定数据类型的长度。
每一个NumPy内置的数据类型都有一个特征码,它能唯一标识一种数据类型
转换数据类型
ndarray对象的数据类型可以通过astype()方法进行转换
data = np.array([[1, 2, 3], [4, 5, 6]])
data.dtype
#数据类型转换为float64
float_data = data.astype(np.float64)
float_data.dtype
04 数组运算
数组运算
1.矢量化运算
形状相等的数组之间的任何算术运算都会应用到元素级,即只用于位置相同的元素之间,所得的运算结果组成一个新的数组
2.数组广播
当形状不相等的数组执行算术计算的时候,就会出现广播机制,该机制会对数组进行扩展,使数组的shape属性值一样,这样就可以进行矢量化运算了
注:广播机制需要满足如下任意一个条件即可:
(1)两个数组的某一维度等长。
(2)其中一个数组为一维数组。
广播机制需要扩展维度小的数组,使得它与维度最大的数组的shape值相同,以便使用元素级函数或者运算符进行运算。
3.数组与标量间的运算
标量运算会产生一个与数组具有相同行和列的新矩阵,其原始矩阵的每个元素都被相加、相减、相乘或者相除
05 ndarray的索引和切片
06 数组的转置和轴对称
数组的转置和轴对称
简单的转置可以使用T属性,它其实就是进行轴对换而已
当使用transpose()方法对数组的shape进行调换时,需要以元组的形式传入shape的编号,比如(1,0,2)
注:如果我们不输入任何参数,直接调用transpose()方法,则其执行的效果就是将数组进行转置,作用等价于transpose(2,1,0)。
有时可能只需要转换其中的两个轴,这时可以使用swapaxes()方法实现,该方法需要接受一对轴编号,比如(1,0)
07 NumPy通用函数
NumPy通用函数
常见的二元通用函数如下表:
注:我们将ufunc中接收一个数组参数的函数称为一元通用函数,接受两个数组参数的则称为二元通用函数,函数返回的是一个新的数组
08 利用NumPy数组进行数据处理
将条件逻辑转为数组运算
NumPy的where()函数是三元表达式x if condition else y的矢量化版本。
arr_x = np.array([1, 5, 7])
arr_y = np.array([2, 6, 8])
arr_con = np.array([True, False, True])
result = np.where(arr_con, arr_x, arr_y)
通过NumPy库中的相关方法,我们可以很方便地运用Python进行数组的统计汇总
arr = np.array([[6, 2, 7],
[3, 6, 2],
[4, 3, 2]])
arr.sort()
如果希望对任何一个轴上的元素进行排序,则需要将轴的编号作为sort()方法的参数传入
arr = np.array([[6, 2, 7],
[3, 6, 2],
[4, 3, 2]])
# 沿着编号为0的轴对元素排序
arr.sort(0)
all()函数用于判断整个数组中的元素的值是否全部满足条件,如果满足条件返回True,否则返回False。
arr = np.array([[1, -2, -7],
[-3, 6, 2],
[-4, 3, 2]])
# arr的所有元素是否都大于0
np.all(arr > 0)
any()函数用于判断整个数组中的元素至少有一个满足条件就返回True,否则就返回False。
arr = np.array([[1, -2, -7],
[-3, 6, 2],
[-4, 3, 2]])
# arr的所有元素是否有一个大于0
np.any(arr > 0)
针对一维数组,NumPy提供了unique()函数来找出数组中的唯一值,并返回排序后的结果。
arr = np.array([12, 11, 34, 23, 12, 8, 11])
np.unique(arr)
in1d()函数用于判断数组中的元素是否在另一个数组中存在,该函数返回的是一个布尔型的数组。
arr = np.array([12, 11, 34, 23, 12, 8, 11])
np.in1d(arr, [11, 12])
NumPy提供的有关集合的函数还有很多,常见的函数如下表所示。
09 线性代数模块
线性代数模块
numpy.linalg模块中有一组标准的矩阵分解运算以及诸如逆和行列式之类的东西
注:矩阵相乘,如果我们通过“*”对两个数组相乘的话,得到的是一个元素级的积,而不是一个矩阵点积。
NumPy中提供了一个用于矩阵乘法的dot()方法。
arr_x = np.array([[1, 2, 3], [4, 5, 6]])
arr_y = np.array([[1, 2], [3, 4], [5, 6]])
# 等价于np.dot(arr_x, arr_y)
arr_x.dot(arr_y)
除此之外,linalg模块中还提供了其他很多有用的函数。
10 随机数模块
随机数模块
rand()函数隶属于numpy.random模块,它的作用是随机生成N维浮点数组
# 随机生成一个二维数组
np.random.rand(3, 3)
除此之外,random模块中还包括了可以生成服从多种概率分布随机数的其它函数。
注:seed( )函数可以保证生成的随机数具有可预测性,也就是说产生的随机数相同。当调用seed()函数时,如果传递给seed参数的值相同,则每次生成的随机数都是一样的。
当传递的参数值不同或者不传递参数时,则seed()函数的作用跟rand()函数相同,即多次生成随机数且每次生成的随机数都不同。
numpy.random.seed(seed=None)