1.NumPy中最重要的一个特点是其N维数组的对象即ndarray对象
2.ndarray对象中定义了做一些重要的属性。
3.创建NumPy数组
(1)创建一个一维数组
data1 = np.array([1,2,3])
(2)创建一个二维数组
data2 = np.array([[1,2,3],[4,5.6]])
(3) 创建元素值全是0的数组
np.zeros((3,4))
(4)创建元素值全是1的数组
np.ones((3,4))
(5)创建元素值全是随机数的数组
np.empty((5,2))
通过arange()函数可以创建一个等差数组,他的功能类似于range(),只不过arange()函数返回的结果是数组,而不是列表。
np.arange(1,20,5)
注意:有些数组元素的后面会跟着一个小数点,而有些元素后后面没有,比如1和1.,产生这种现象,主要是因为元素的数据类型不同所导致的。
4.查看数据类型
ndarray.dtype可以创建一个表示数据类型的对象,如果希望获取数据类型的名称,则需要访问name属性进行获取。
data_one = np.array([[1,2,3],[4,5,6]])
data_one.dytpe.name
常用的数据类型如下图
每一个NumPy内置的数据类型都有一个特征码,它能唯一标识一种数据类型。
5.ndarray对象的数据类型可以通过astype()方法进行转换。
data = np.array([[1, 2, 3], [4, 5, 6]])
data.dtype
#数据类型转换为float64
float_data = data.astype(np.float64)
float_data.dtype
6.矢量化运算
数组运算可以分三种:矢量化运算,广播机制,数组与标量运算
形状相同的数组 形状不同的数组 标量
形状相等的数组之间的任何算术
运算都会应用到元素级,即只用
于位置相同的元素之间,所得的
运算结果组成一个新的数组。
数组广播
广播机制需要满足如下任意一个条件即可:
(1)两个数组的某一维度等长
(2)其中一个数组为一维数组。
广播机制需要扩展维度小的数组,使得它与维度最大的数组的shape值相同,以便使用元素级函数或者运算符进行运算。
7.整数索引和切片的基本使用
arr = np.arange(8)
# 获取索引为5的元素
arr[5]
# 获取索引为3~5的元素,但不包括5
arr[3:5]
在二维数组中,每个索引位置上的元素不再是一个标量了,而是一个一维数组。
arr2d = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 获取索引为1的元素
arr2d[1]
8.数组的转置和轴对称
数组的转置指的是将数组中的每个元素按照一定的规则进行位置变换。
NumPy提供了两种实现方式:
•T属性(进行轴对换)
transpose()方法
当使用transpose()方法对数组的shape进行调换时,需要以元组的形式传入shape的编号,比如(1,0,2)。
9.NumPy通用函数
通用函数(ufunc)是一种针对ndarray中的数据执行元素级运算的函数,函数返回的是一个新的数组。
•我们将ufunc中接收一个数组参数的函数称为一元通用函数,接受两个数组参数的则称为二元通用函数。
常见的一元通用函数如下:
常用二元通用函数如下表:
10.利用NumPy数组进行数据处理
(1)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)
(2)通过NumPy库中的相关方法,我们可以很方便地运用Python进行数组的统计汇总。
(3)如果希望对NumPy数组中的元素进行排序,可以通过sort()方法实现。
arr = np.array([[6, 2, 7],
[3, 6, 2],
[4, 3, 2]])
arr.sort()
(4)如果希望对任何一个轴上的元素进行排序,则需要将轴的编号作为sort()方法的参数传入。
arr = np.array([[6, 2, 7],
[3, 6, 2],
[4, 3, 2]])
# 沿着编号为0的轴对元素排序
arr.sort(0)
(5)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)
(6)针对一维数组,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提供的有关集合的函数还有很多,常见的函数如下表所示。
11.随机数模块
(1)与Python的random模块相比,NumPy的random模块功能更多,它增加了一些可以高效生成多种概率分布的样本值的函数。
随机生成一个二维数组
np.random.rand(3, 3)
rand()函数隶属于numpy.random模块,它的作用是随机生成N维浮点数组。
除此之外,random模块中还包括了可以生成服从多种概率分布随机数的其它函数。
(2)seed( )函数可以保证生成的随机数具有可预测性,也就是说产生的随机数相同。
numpy.random.seed(seed=None)
上述函数中只有一个seed参数,用于指定随机数生成时所用算法开始的整数值。
当调用seed()函数时,如果传递给seed参数的值相同,则每次生成的随机数都是一样的。
当传递的参数值不同或者不传递参数时,则seed()函数的作用跟rand()函数相同,即多次生成随机数且每次生成的随机数都不同。
12.线性代数模块
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)
矩阵点积的条件是矩阵A的列数等于矩阵B的行数,假设A为 m*p的矩阵,B为 p*n 的矩阵,那么矩阵A与B的乘积就是一个 m*n 的矩阵C,其中矩阵C的第i行第j列的元素可以表示为:
除此之外,linalg模块中还提供了其他很多有用的函数。