Numpy的21个常用知识点(1)

简介: Numpy的21个常用知识点(1)

前言

有些萌新还在使用Pycharm进行Numpy等的学习,个人建议不要偷懒,下载anaconda,使用Jupyter Notebook进行探索性学习。不明白他们之间关系的可以看以下文章。


https://blog.csdn.net/suic009/article/details/122803865?spm=1001.2014.3001.5502


当我们在Jupyter Notebook中执行import numpy未发生报错时,说明下载成功。


不成功的记得在编译器中pip install numpy 或者conda install numpy,注意环境变量和下载位置。


当然也可以查看其版本:

96447814-120fc980-1245-11eb-938d-6ea408716c72.png

(小白ps:as的作用是给其起个别名;__version__,这样形式的一般都是使用的这个类或者对象内部的一些属性方法如__name__、__sizeof__()等。)


Jupyter提词器下载:


提前退出anaconda,打开anaconda prompt输入以下命令:


pip install jupyter_contrib_nbextensions -i https://pypi.mirrors.ustc.edu.cn/simple

jupyter contrib nbextension install --user


pip install --user jupyter_nbextensions_configurator

jupyter nbextensions_configurator enable --user


再次进入jupyter notebook多了以下选项,点击进入  

96447814-120fc980-1245-11eb-938d-6ea408716c72.png

取消勾选,选中Hinterland

96447814-120fc980-1245-11eb-938d-6ea408716c72.png

成功

一、Numpy与Python用于数组计算的性能对比

首先我们以一个需求进行分析:

  • 数组A是1~N数字的平方
  • 数组B是1~N数字的立方
  • 实现两个数组的加法

对比使用Numpy和原生Python的性能对比

对于Python:

def python_sum(n):
    """ Python实现数组的加法
    @param n:数组的长度
    """
    a = [i**2 for i in range(n)] # 生成第一个数组
    b = [i**3 for i in range(n)] # 生成第二个数组
    c = []
    for i in range(n):
        c.append(a[i] + b[i])
    return c

对于使用Numpy:

def numpy_sum(n):
    """ numpy实现数组的加法
    @param n:数组的长度
    """
    a = np.arange(n) ** 2 # 0 - n-1 每个数平方
    b = np.arange(n) ** 3
    return a+b # 结果元素与上方python相同。

我们分别对python_sum和numpy_sum传入1K,1W,10W、100W、1000W次对比运行时间:

%timeit python_sum(n)
%timeit numpy_sum(n)

将结果打包在一起,得到如下(记得统一时间单位,这里统一微秒。):

pytime = [432,4.69*1000,51.9*1000,533*1000,5.42*1000*1000]
nptime = [5.63,31.1,282,5.16*1000,52.3*1000]

我们引用后面学到的Pandas将其转变为DataFrame形式的二维表格:

96447814-120fc980-1245-11eb-938d-6ea408716c72.png

此时我们得到df。使用后面学到的matplotlib进行画图:

96447814-120fc980-1245-11eb-938d-6ea408716c72.png

96447814-120fc980-1245-11eb-938d-6ea408716c72.png

至于其为什么这么高效,除了内部的一些优化操作更加便捷以外,其数据类型更接近C语言。如Python中一个int类型占28个字节(24个来自于int封装对象,4个字节来自真正的int),而在numpy中一个int类型默认只占4字节。


anaconda中还有很多强大的功能,这些都离不开C语言,我们可以看到在ananconda的安装目录有存有MinGW文件。

二、Numpy的核心array

array对象的背景:

Numpy的核心数据结构,就叫做array就是数组,array对象可以是一维数组,也可以是多维数组;

Python的List也可以实现相同的功能,但是array比List的优点在于性能好、包含数组元数据信息、大量的便捷函数;

Numpy成为Scipy、Pandas、Scikit-Learn、Tensorflow、PaddlePaddle等框架的“通用底层语言”

Numpy的array和Python的List的一个区别,是它元素必须都是同一种数据类型,比如都是数字int类型,这也是Numpy高性能的一个原因;

array本身的属性


shape:返回一个元组,表示array的维度

ndim:一个数字,表示array的维度的数目

size:一个数字,表示array中所有数据元素的数目

dtype:array中元素的数据类型

创建array的方法


从Python的列表List和嵌套列表创建array

使用预定函数arange、ones/ones_like、zeros/zeros_like、empty/empty_like、full/full_like、eye等函数创建

生成随机数的np.random模块构建

array本身支持的大量操作和函数


直接逐元素的加减乘除等算数操作

更好用的面向多维的数组索引

求sum/mean等聚合函数

线性代数函数,比如求解逆矩阵、求解方程组

2.1 使用list创建一维array和二维array

96447814-120fc980-1245-11eb-938d-6ea408716c72.png

2.2 数组array的属性

Array.shape 查看数组的形状

96447814-120fc980-1245-11eb-938d-6ea408716c72.png

Array.ndim 查看数组的维度

Array.size 查看数组中元素的个数

Array.dtype 查看数组中元素的类型

Array.itemsize 查看单个元素所占字节数

Array.nbytes 查看数组中所有元素所占字节数

再次提醒,为保证高效率的计算,数组中的元素会统一类型。

如arr = [1,2.0,'3'] 元素类型会全部转变为object字符类型。没有object的话其次才是浮点型。

2.3 常用的array生成函数

以下除了arrange和random,基本都是xx:生成xx类型数组;xx_like(a)模仿数组a生成xx类型数组。

使用arange创建数字序列

arange([start,] stop[, step,], dtype=None)

使用ones创建全是1的数组

np.ones(shape, dtype=None, order='C')

shape : int or tuple of ints

Shape of the new array, e.g., ``(2, 3)`` or ``2``.

使用ones_like创建形状相同的数组

ones_like(a, dtype=float, order='C')

使用zeros创建全是0的数组

np.zeros(shape, dtype=None, order='C')

使用zeros_like创建形状相同的数组

np.zeros_like(a, dtype=None)

使用empty创建全是0的数组

empty(shape, dtype=float, order='C')  

注意:数据是未初始化的,里面的值可能是随机值不要用

使用empty_like创建形状相同的数组

empty_like(prototype, dtype=None)

使用full创建指定值的数组

np.full(shape, fill_value, dtype=None, order='C')

使用full_like创建形状相同的数组

np.full_like(a, fill_value, dtype=None)

用random模块生成随机数的数组

randn(d0, d1, ..., dn) 随机数会在后面讲解

2.4 array本身支持大量操作和函数

这里先稍做展示,后面会经常用到。

比如这样生成一个二维数组:

运算:

96447814-120fc980-1245-11eb-938d-6ea408716c72.png

三、给数组排序

Numpy给数组排序的三个方法:  


numpy.sort:返回排序后数组的拷贝,即不改变本身。

array.sort:原地排序数组而不是返回拷贝,即改变本身。

numpy.argsort:间接排序,返回的是排序后的数字索引

3个方法都支持一个参数kind,可以是以下一个值:


quicksort:快速排序,平均O(nlogn),不稳定情况

mergesort:归并排序,平均O(nlogn),稳定排序

heapsort:堆排序,平均O(nlogn),不稳定排序

stable:稳定排序

3.1 np.sort排序

3.2 array.sort排序

即np.sort不改变操作的数组返回一个新数组,array.sort改变操作的数组。

个人喜欢用np.sort(),就算需要改变数组本身时,直接以arr = np.sort(arr)这种形式写就行了,要会灵活运用。

3.3  np.argsort 返回的是有序数字的索引

3.4 Python原生sorted与np.sort对比

首先我们都知道python的列表里有一个.sort方法,这个方法是list独有的且也只能操作list。对于list.sort()它没有返回值改变list本身,要求内部类型统一否则会报错。

对于sorted(list)它的局限反而没那么大,还可以对字典等根据某个键、值进行排序。

但这些排序的内部都是基于冒泡排序完成的。而我们的np.sort则是快速排序。

由于快速排序具有很强的不稳定性, 所以也有上面说的这些可选:

96447814-120fc980-1245-11eb-938d-6ea408716c72.png

四、Numpy常用random函数

常用如下:

96447814-120fc980-1245-11eb-938d-6ea408716c72.png

更多请查看官方网址:https://docs.scipy.org/doc/numpy-1.14.0/reference/routines.random.html 

1. rand(d0, d1, ..., dn)

返回数据在[0, 1)之间,具有均匀分布

96447814-120fc980-1245-11eb-938d-6ea408716c72.png

2. randn(d0, d1, ..., dn)

返回数据具有标准正态分布(均值0,方差1)

96447814-120fc980-1245-11eb-938d-6ea408716c72.png

3. randint(low[, high, size, dtype])

生成随机整数,包含low,不包含high  

如果high不指定,则从[0, low)中生成数字

(ps:在python中random.randint(a,b) 是包含b的)

96447814-120fc980-1245-11eb-938d-6ea408716c72.png

4. random([size])    

生成[0.0, 1.0)的随机数

96447814-120fc980-1245-11eb-938d-6ea408716c72.png

5. choice(a[, size, replace, p])

a是一维数组,从它里面生成随机结果

96447814-120fc980-1245-11eb-938d-6ea408716c72.png

6. shuffle(x)    

把一个数组x进行随机排列

96447814-120fc980-1245-11eb-938d-6ea408716c72.png

7. permutation(x)

把一个数组x进行随机排列,或者数字的全排列

96447814-120fc980-1245-11eb-938d-6ea408716c72.png

8. normal([loc, scale, size])

按照平均值loc和方差scale生成高斯分布的数字

96447814-120fc980-1245-11eb-938d-6ea408716c72.png

9. uniform([low, high, size])

在[low, high)之间生成均匀分布的数字

96447814-120fc980-1245-11eb-938d-6ea408716c72.png

实例:对数组加入随机噪声

96447814-120fc980-1245-11eb-938d-6ea408716c72.png

96447814-120fc980-1245-11eb-938d-6ea408716c72.png

相关文章
|
存储 数据可视化 数据挖掘
Numpy的21个常用知识点(3)
Numpy的21个常用知识点(3)
Numpy的21个常用知识点(3)
|
机器学习/深度学习 索引 Python
Numpy的21个常用知识点(2)
Numpy的21个常用知识点(2)
Numpy的21个常用知识点(2)
numpy的使用说明(二):这一章设计很多重要知识点(必看)(三)
numpy的使用说明(二):这一章设计很多重要知识点(必看)(三)
numpy的使用说明(二):这一章设计很多重要知识点(必看)(三)
numpy的使用说明(二):这一章设计很多重要知识点(必看)(二)
numpy的使用说明(二):这一章设计很多重要知识点(必看)(二)
numpy的使用说明(二):这一章设计很多重要知识点(必看)(二)
numpy的使用说明(二):这一章设计很多重要知识点(必看)(一)
numpy的使用说明(二):这一章设计很多重要知识点(必看)(一)
numpy的使用说明(二):这一章设计很多重要知识点(必看)(一)
|
2月前
|
存储 Java 数据处理
(numpy)Python做数据处理必备框架!(一):认识numpy;从概念层面开始学习ndarray数组:形状、数组转置、数值范围、矩阵...
Numpy是什么? numpy是Python中科学计算的基础包。 它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/0 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。 Numpy能做什么? numpy的部分功能如下: ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++
304 0
|
2月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
157 0
|
4月前
|
机器学习/深度学习 API 异构计算
JAX快速上手:从NumPy到GPU加速的Python高性能计算库入门教程
JAX是Google开发的高性能数值计算库,旨在解决NumPy在现代计算需求下的局限性。它不仅兼容NumPy的API,还引入了自动微分、GPU/TPU加速和即时编译(JIT)等关键功能,显著提升了计算效率。JAX适用于机器学习、科学模拟等需要大规模计算和梯度优化的场景,为Python在高性能计算领域开辟了新路径。
382 0
JAX快速上手:从NumPy到GPU加速的Python高性能计算库入门教程
|
4月前
|
存储 数据采集 数据处理
Pandas与NumPy:Python数据处理的双剑合璧
Pandas与NumPy是Python数据科学的核心工具。NumPy以高效的多维数组支持数值计算,适用于大规模矩阵运算;Pandas则提供灵活的DataFrame结构,擅长处理表格型数据与缺失值。二者在性能与功能上各具优势,协同构建现代数据分析的技术基石。
353 0
|
机器学习/深度学习 数据处理 Python
从NumPy到Pandas:轻松转换Python数值库与数据处理利器
从NumPy到Pandas:轻松转换Python数值库与数据处理利器
327 1