numpy是Python中的基础模块,类型ndarray定义了一个具有矢量算术运算的多维数组,无需编写循环,就能对整个数组进行批量运算。通常情况下,导入numpy,设置别名为np。
import numpy as np
一,创建多维数组
ndarray是N-Dimension-Array的简称,该对象是一个快速而灵活的大数据集容器,该容器中存储的元素的数据类型都是相同的。
创建矩阵的方法有array()、arange()、ones函数和zeros函数,array()是一个函数,用于创建ndarray类型的对象。
1,使用array()函数创建数组
使用array()函数创建数组,可以使用type()函数查看对象的类型:
a = np.array([1,2,3,4,5])
a2 = np.array([[1,2,3,4,5],[6,7,8,9,10]])
通过array()函数,使用列表创建的是一维数组,使用嵌套的列表创建的是多维数组。
2,使用arange()函数创建矩阵
通过arange()函数创建矩阵,arange类似于Python的内置函数range,但返回的是一个ndarray,而不是列表。
函数的参数分别是:start、end和step,
a = np.arange(10) #default start=0, end=10(exclude 10),step=1 # [0 1 2 3 4 5 6 7 8 9] a1 = np.arange(5,10) # start=5, end=10(exclude=10),step=1 # [5 6 7 8 9] a2 = np.arange(5,20,2) # start=5, end=20(exclude 20),step=2 #[ 5 7 9 11 13 15 17 19]
3,使用ones(),zeros()和eye()函数创建数组
使用ones()创建元素都为1的数组,使用zeros()函数创建元素都是0的数组,参数是表示数组形状shape的元组,表示的是数组各个维度的元素数量。最简单的二维数组的shape元组是(row_num, column_num) ,它表示数组的行数量和列数量。
>>> a=np.ones(3); array([ 1., 1., 1.]) >>> b=np.ones((3,2)); array([[ 1., 1.], [ 1., 1.], [ 1., 1.]]) >>> c=np.zeros(3) array([ 0., 0., 0.]) >>> d=np.zeros((2,3)); array([[ 0., 0., 0.], [ 0., 0., 0.]])
eye()创建一个正方形的NxN的单位矩阵,对角线的元素值是1,其余元素值是0
二,数组的属性
数组对象的属性主要有:
- dtype:描述数组元素的类型
- shape:以tuple表示的数组形状
- ndim:数组的维度
- size:数组中元素的个数
1,dtype对象
dtype是一个特殊的对象,它表示数组元素的类型。
2,shape对象
以元组形式表示一个数组的维度
3,ndim对象
数组各个维度的元素数量
三,索引和切片
ndarray对象的元素可以通过索引或切片来访问和修改,索引基于0。
1,数组的索引
一维数组很简单,从表面上看,一维数组的索引跟Python列表的功能差不多。
arr = np.arange(10)
arr[index]
arr[start:end]
arr[start:end:step]
在一个二维数组中,各索引位置上的元素不再是标量,而是一维数组。
arr2d=np.array([[1,2,3],[4,5,6],[7,8,9]]) >>> arr2d[2] # array([7,8,9]) >>> arr2d[0][2] #3 >>> arr2d[0,2] #3
对于更高维度的数组,一个中括号表示一个维度,索引的使用依此类推。
2,数组的切片
数组切片是原始数组的视图,修改切片中的原始,会直接修改原始数据。数组的切片是Python基本切片的概念从一维到N维的扩展,通过中括号,start,stop和step参数提供给内置函数的slice函数来构造一个Python slice对象,此slice对象被传递给数组来提取数组的一部分。
获取切片的格式是[start:end:step],如果省略start,使用start的默认值0;如果省略end,那么end的默认值是:维度长度-1;如果省略step,使用step的默认值1。通常情况下,数组的切片是[start:end],这就意味着使用step的默认值1。
对于一维数组,数组切片上的任何修改都会直接修改原始数组:
arr = np.arange(10) arr_slice=arr[5:8] arr_slice[1]=111 #arr=array([0,1,2,3,4,5,111,7,8,9]) arr_slice[:]=222 #arr=array([0,1,2,3,4,222,222,222,8,9])
对于二维数组,一个中括号表示一个维度,依此类推。
四,数组的操作
numpy模块内置的函数能够对数组进行复杂而高效的操作。
1,排序sort
sort(axis,kind)函数用于对数组进行排序,axis指定排序的轴;kind指定排序算法,默认的排序算法是快速排序,np.sort()返回的是数组的已排序的副本,而就是排序则会修改数组本身。
arr.sort()
arr_sort=np.sort(arr)
2,argsort()函数
argsort()函数返回的是按照数组值从小到大的索引值,即返回的是索引值,索引值是按照元素值从小到大得到的。
x=np.array([1,4,3,-1,6,9]) y=np.argsort(x) #output array([3, 0, 2, 1, 4, 5], dtype=int64)
元素-1的值是最小的,其索引是3,因此,argsort()的返回列表中是第一个item。
argsort()函数是将x中的元素从小到大排列,提取其对应的index(索引),然后输出到y,按照降序排序:
y=np.argsort(-x)
按照升序排序:
y=np.argsort(x)
3,vectorize 向量化
numpy.vectorize()函数定义一个向量化函数,它以序列或numpy数组作为输入,对numpy数组做向量化操作。函数输出的数据类型是由otypes参数确定的,如果otypes=None,那么输出的数据类型是通过使用输入的第一个元素调用函数来确定的,该函数返回一个函数对象。
numpy.vectorize(pyfunc, otypes=None, doc=None, excluded=None, cache=False, signature=None)
参数注释:
- pyfunc:函数对象
- otype:输出数据的类型(putput data type)
使用vectorize()定义一个向量化函数,对数组做向量化操作:
def myfunc(a, b): return a-b if a>b else a+b vfunc = np.vectorize(myfunc) vfunc([1, 2, 3, 4], 2) #output array([3, 4, 1, 2])
4,tolost
tolost()函数用于把一个矩阵转化为list列表
5,reshap
reshap(array,newshape) :返回一个给定shape的数组的副本,例如,下面的代码把一个一维数组转换为4行2列的二位数组:
a=np.arange(8) np.reshape(a,(4,2))
6,flatten
返回展平数组,原数组不改变
a=np.arange(8) b=np.reshape(a,(4,2)) b.flatten()
五,随机数生成
numpy.random模块是对Python内置的random的升级,增加了一些用于搞笑生成多种概率分布的样本值的函数。
常用的numpy.random模块的函数:
- seed:确定随机数生成器的种子
- permutation:返回一个序列的随机排列
- shuffle:对一个序列就地进行随机排列
- rand:产生均匀分布的样本值
- randint:从给定的上下限范围内随机选取正数
- randn:产生标准正态分布
- binomial:产生二项分布的样本值
- normal:产生高斯正态分布的样本值
- beta:产生Beta分布的样本值
- chisquare:产生卡方分布的样本值
- gamma:产生伽马分布的样本值
- uniform:产生在[0,1]范围中均匀分布的样本值
例如,使用normal得到一个标准正态分布的4×4样本数组:
samples=np.random.normal(size=(4,4))
参考文档: