NumPy基础

NumPy文档:Overview — NumPy v1.21 Manual

NumPy中文参考手册:NumPy 参考手册 | NumPy 中文

NumPy教程:NumPy 数组属性 | 菜鸟教程

数组和矩阵的区别

数组中的元素可以是数字、字符等,矩阵只能是数字。

视图和副本

副本是数据的一份完整拷贝(深拷贝,deep copy)。如果对副本进行修改,由于内存地址不同,原数据不会受到影响。

视图是数据的一个别称或引用(浅拷贝,shallow copy)。如果对视图进行修改,由于内存地址相同,原数据会受到影响。

视图一般发生在:

  • numpy 的切片操作返回原数据的视图
  • 调用 ndarray 的 view() 函数产生一个视图

副本一般发生在:

  • Python 序列的切片操作,调用deepCopy()函数
  • 调用 ndarray 的 copy() 函数产生一个副本

一、数组属性

方法描述
ndarray.shape数组维度的元组
ndarray.ndim数组维度数量
ndarray.size数组元素总数
ndarray.dtype数组元素的数据类型

二、创建数组

方法描述
np.array(object, dtype)创建数组
np.asarray(object, dtype)将输入转换为数组。当object为数组时,np.array生成副本,np.asarray生成视图
np.ascontiguousarray(array_like, dtype)转换为内存连续的数组
np.zeros(shape, dtype)创建零数组
np.zeros_like(array_like, dtype)创建零数组
np.ones(shape, dtype)创建元素值全为1的数组
np.ones_like(array_like, dtype)创建元素值全为1的数组
np.eye(N) <=> np.identity(N)创建单位数组
np.arange(start=0, stop, step=1)在区间内生成有序数列,取值范围[start, stop)
np.linspace(start, stop, num, endpoint)在区间内生成均匀间隔的点。start、stop是array_like的数据,默认endpoint=True。当endpoint=True时,间隔为(stop-start)/(num-1),生成的序列包含stop;当endpoint= False时,间隔为(stop-start)/(num),生成的序列不包含stop
np.random.rand(*dn)                     <=> np.random.random(size)生成[0,1)区间内的浮点随机数数组
np.random.randn(*dn)生成标准正态分布的随机数数组
np.random.randint(low, high, size, dtype)生成指定范围内的随机整数数组

三、索引和切片

数组可以通过Python语法 a[obj] 进行索引,触发基本索引还是高级索引取决于obj的类型。

1.基本索引和切片

当obj为int、slice对象或int和slice对象的元组时,将触发基本索引。通过切片(slice)生成的数组是原数组的视图

注:在Python中,a[(exp1, exp2, ., expn)] <=> a[exp1, exp2, ., expn] ,后者是前者的语法糖(syntax sugar)。

以二维数组a为例:

方法描述
a[0, 1] <=> a[0][1]整数索引,取一个元素,返回标量a[0][1]分别对a、a[0]进行索引,效率较低
a[start: stop: step]切片索引,下标取值范围[start, stop),步长step,当step=-1时为倒序
a[0, : ]切片索引,取一行,返回一维数组
a[0: 3, 1: 4]切片索引,取几行几列
b[ : , : , 0] <=> b[ ... , 0]切片索引,省略号

2.高级索引

返回原数组的副本

注:a[ndarray1, ndarray2, ., ndarrayn] <=> a[list1, list2, ., listn];如果索引是一个连续的整数列表[n, n+1, n+2, ..., N], 则可以等效为range(n, N+1)。

以二维数组a为例:

方法描述
a[[0], [1]]                                        a[[0, 1], [1, 2]] <=> [a[0, 1], [1, 2]]整数数组索引,取一个或几个元素,返回一维数组,其长度和索引的长度相同
a[[0], : ]                                              a[:, [1, 0]] <=> [a[:, 1], a[:, 0]]整数数组索引,保持维数不变
a[a>0]布尔索引,索引形状与a相同,返回一个包含符合条件的元素的一维数组
a = np.array([[0, 1, 2],                                            [3, 4, 5]])                       b = np.array([False, True])             >>> a[b]                                 array([[3, 4, 5]])                             布尔索引,用b中的元素索引a的行
a[[0, 1, 2]] <=> [a[0], a[1], a[2]]花式索引,保持维数不变
a = np.array([[ 0,  1,  2, 3],                                        [ 4,  5,  6,  7],                                       [ 8,  9, 10, 11]])              b = np.array([[0, 1],                                                   [1, 2]])                      >>> a[b]                                    array([[[ 0,  1,  2,  3],                                       [ 4,  5,  6,  7]],                                    [[ 4,  5,  6,  7],                                       [ 8,  9, 10, 11]]])        a[b].shape=(b.shape[0], b.shape[1],    a.shape[1])                        花式索引,a、b都为数组,用b中的元素索引a的行
a[np.ix_(*args)]                                   a[np.ix_([0, 1], [1, 2])]                         <=> a[[[0], [1]], [1, 2]]                           <=> [[a[0, 1], a[0, 2]],                                    [a[1, 1], a[1, 2]]]花式索引,arg为一维序列

四、数组广播

当运算中的两个数组有值为1的维度且其他维度相同时,numpy将自动触发广播机制。

五、数组方法

1.数组转换

方法描述
ndarray.tolist()将数组转换为列表
ndarray.astype(dtype)强制数据类型转换
ndarray.copy()返回原数组的副本

2.形状操作

方法描述
ndarray.reshape(shape)返回具有新形状的数组(视图)          注:ndarray.reshape可以传入独立的参数,而np.reshape只能传入tuple of ints,例如a.reshape(1,2) <=> a.reshpe((1,2))
ndarray.resize(shape)无返回值,更改原数组的形状
ndarray.flatten()返回一维数组(副本)
ndarray.ravel()                                     <=> ndarray.reshape(-1)返回一维数组(视图)
ndarray.transpose(*axes)转置数组(视图)
ndarray.squeeze(axis)删除值为1的维度(视图)
np.expand_dims(ndarray, axis=0)       <=> ndarray[np.newaxis, : ]           <=> ndarray[None, : ]      增加一个维度(视图)

3.计算

默认axis=None, keepdims=False

方法描述
ndarray.max(axis, keepdims)返回给定轴上元素的最大值
ndarray.argmax(axis)返回给定轴上元素的最大值的索引
ndarray.min(axis, keepdims)返回给定轴上元素的最小值
ndarray.argmin(axis)返回给定轴上元素的最小值的索引
ndarray.sum(axis, keepdims)返回给定轴上元素的和
ndarray.cumsum(axis)返回给定轴上元素的累加和
ndarray.mean(axis, keepdims)返回给定轴上元素的平均值
ndarray.var(axis, keepdims)返回给定轴上元素的方差
ndarray.std(axis, keepdims)返回给定轴上元素的标准差
ndarray.prod(axis, keepdims)返回给定轴上元素的乘积
ndarray.clip(min, max)返回元素值限制为[min, max]的数组
np.maximum(x1, x2)比较两个数组对应元素的大小,返回最大值,两个数组形状不同时将触发广播机制
np.minimum(x1, x2)比较两个数组对应元素的大小,返回最小值,两个数组形状不同时将触发广播机制
np.multiply(x1, x2) <=> x1*x2矩阵对应元素相乘,当x1、x2为np.mat()类型时,“*”表示矩阵相乘
np.dot(x1, x2)矩阵相乘,x1、x2可以为标量。当x1、x2为多维矩阵时,np.dot()的形状与np.matmul()不同
np.matmul(x1, x2) <=> x1@x2矩阵相乘,x1、x2不能为标量。当x1、x2为二维矩阵时,np.matmul()等价于np.dot();当x1、x2为多维矩阵时,x1、x2的前n-2维维度不一致则进行广播,后两维进行矩阵相乘

4.逻辑函数

方法描述
ndarray.all(axis, keepdims)给定轴上所有元素都为True,则返回True
ndarray.any(axis, keepdims)给定轴上有元素为True,则返回True
np.logical_and(x1, x2)与运算
np.logical_or(x1, x2)或运算
np.logical_not(x)非运算
np.logical_xor(x1, x2)异或运算

5.数组堆叠与重复

方法描述
np.stack((a, b), axis=0)新的维度上堆叠数组,a、b形状必须相同
np.vstack((a, b))在第一维上堆叠数组
np.hstack((a, b))在第二维上堆叠数组
np.concatenate((a, b), axis=0)已有维度上堆叠数组
np.repeat(array_like, repeats, axis=None)重复数组元素,repeats可以是int或array of ints,表示a中的元素重复的次数,返回的数组除了给定的轴外形状与a相同
np.tile(array_like, repeats)重复数组,repeats可以是int或array of ints

6.项目选择和操作

方法描述
ndarray.sort(axis)将数组中的元素从小到大排序。默认axis=-1,当axis=None时返回一维数组。ndarray.sort()也可以对结构化数组进行排序
ndarray.argsort(axis)将数组中的元素从小到大排序后返回对应的索引。默认axis=-1,当axis=None时返回一维数组
ndarray.searchsorted(a, v, side=left)检索v中元素在a中的索引                    当side=left时,i满足a[i-1] < v <= a[i]   当side=right时,i满足a[i-1] <= v < a[i]
ndarray.nonzero(array_like)           <=> np.where(ndarray!=0)                                                            (a>3).nonzero()                                    <=> np.where(a>3)返回一个长度为a.dim的坐标列表,列表元素是非零元素的各维坐标
np.where(condition, x=None, y=None)                                           <=> np.where(ndarray!=0)当只有一个参数condition时(比如a>0),返回一个长度为a.dim的坐标列表,列表元素是满足条件的数组元素的各维坐标;当有三个参数时,x中不满足要求的元素由y赋值 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值