1、Numpy概念
1.1Numpy是什么?
- Numpy是(Numerical Python的缩写):
- 一个开源的Python科学计算库
- 使用NumPy可以方便的使数组、矩阵进行计算
- 包含线性代数、傅里叶变换、随机数生成等大量函数
1.2为什么使用Numpy
对于同样的数值计算任务,使用NumPy比直接编写Python代码实现,优点:
- 代码更简洁:NumPy直接以数组、矩阵为粒度计算并且支持大量的数学函数,而Python需要用for循环从底层实现;
- 性能更高效:NumPy的数组存储效率和输入输出计算性能,比Python使用List或者嵌套List好的多;
注:(NumPy的数据存储和Python原生的List是不一样的)
注:NumPy的大部分代码都是C语言实现的,这也是NumPy比纯Python代码效率高效的原因
NumPy是Python各种数据科学类库的基础库
- 比如SicPy、Scikit-Learn、Tensorflow、PaddlePaddle等
- 如果不会NumPy,这些库的深入理解都会遇到障碍
1.3怎样安装NumPy?
- 如果是安装的anaconda,则自带了NumPy
Anaconda是Python最流行的一个已经集成了非常多类库的安装包;不论是学习、实验、线上部署,Anaconda当前都是使用Python的首选安装环境。
官网路径:安装_Anaconda 中文网
- 如果安装的是官网Python,则可以用pip安装 NumPy
在命令行下使用 pip install numpy即可安装 - 验证是否安装NumPy,进入Python命令行
输入import NumPy as np,如果没有报错则安装成功
2、ndarry对象
NumPy提供了两种基本对象,即ndarray(N-dimensional Array)对象和ufunc(Universal Function,即通用函数)对象。
- ndarray是一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组;
- ufunc则提供了对数组进行快速运算的标准数学函数。
2.1ndarray的创建与索引
2.1.1创建ndarray
在Numpy中,可以由函数array、arange、linspace、logspace、zeros、eye、diag及ones等创建ndarray。此外,NumPy还提供了随机数相关函数。
形状: 1、reshape方法 用于改变ndarray的形状,不改变原始的数据值,不改变原来的ndarray的形状(本身不改变) 2、resize方法 用于改变ndarray的形状,不改变原始的数据值,改变原来的ndarray的形状 3、shape 通过修改ndarrray的shape属性也可以实现ndarray形状的更改,直接操作于ndarray本身 4、展平:多维ndarray转化为一维ndarray的操作过程。 (1)ravel:横向展平 (2)flatten:既可以横向展平,也可纵向展平 例如:arr.flatten('F') 即为arr纵向展平 组合: 1、横向组合:hstack 2、纵向组合:vstack 3、既支持横向组合有支持纵向组合:concatenate 注: axis = 1 横向组合 axis = 0 纵向组合 4、深度组合:dstack 会改变原有的ndarray的维度 分割: 1、横向分割:hsplit 只适用于均等分割 2、纵向分割:vsplit 只适用于均等分割 3、既支持横向分割有支持纵向分割:split 注: axis = 1 横向分割(按列分割) axis = 0 纵向分割(按行分割) 4、深度分割:dsplit 条件:1.必须是三维数组 2.分割数目必须是shape属性中下标为2的值得公约数
''' 排序: NumPy的主要排序方式:直接排序 间接排序 1、直接排序指对数值直接进行排序; 2、间接排序是指根据一个或多个键对数据集进行排序。 NumPy中的常用排序函数有sort、argsort和lexsort函数。 1、sort函数: 默认、axis=-1或者1,横轴排序 当axis=None时,展平(底层调用了flatten方法)并排序 当axis=0时,纵轴排序,不展平 2、argsort和lexsort函数: 返回的是元素下标 搜索: 最大值:argmax 返回值:最大值元素的下标 最小值:argmin 返回值:最小值元素的下标 where(condition ,x,y) 类似于三元运算符 返回值:元素的下标 condition 表达式 x:true y:false extract函数 返回值:具体的元素 arr = [[7 4 8 5] [7 3 7 8] [5 4 8 8]] 例如:print(np.extract(arr>6,arr)) ==[7 8 7 7 8 8 8] '''
import numpy as np
# 随机种子
np.random.seed(42)
arr = np.random.randint(1,10,size=12).reshape(3,4)
print(arr)
print('默认的排序:\n',np.sort(arr))
# print('None排序:',np.sort(arr,axis=None))
print('默认(-1)的排序:\n',np.sort(arr,axis=-1))
print('1的排序:\n',np.sort(arr,axis=1))
# print('0的排序:\n',np.sort(arr,axis=0))
# print('None排序:',np.sort(arr,axis=None))
# print("原数组下标\n",np.argsort(arr ,axis=None))
# [[7 4 8 5] [7 3 7 8] [5 4 8 8]]
# 0 1 2 3 4 5 6 7 8 9 10 11
# arr1 = np.arange(0,12).reshape(3,4)
# print(arr1)
# print("最大值得索引:",np.argmax(arr))
# print("最小值得索引:",np.argmin(arr))
# 类似于三元运算符
# print(np.where(arr>6 ,arr,"false"))
# 花式索引
# where 返回的是下标
print(np.where(arr>6))
print(arr[[0, 0, 1, 1, 1, 2, 2],[0, 2, 0, 2, 3, 2, 3]])
# # extract 返回具体的元素
print(np.extract(arr>6,arr))