前言
有些萌新还在使用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,注意环境变量和下载位置。
当然也可以查看其版本:
(小白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多了以下选项,点击进入
取消勾选,选中Hinterland
成功
一、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形式的二维表格:
此时我们得到df。使用后面学到的matplotlib进行画图:
至于其为什么这么高效,除了内部的一些优化操作更加便捷以外,其数据类型更接近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
2.2 数组array的属性
Array.shape 查看数组的形状
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本身支持大量操作和函数
这里先稍做展示,后面会经常用到。
比如这样生成一个二维数组:
运算:
三、给数组排序
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则是快速排序。
由于快速排序具有很强的不稳定性, 所以也有上面说的这些可选:
四、Numpy常用random函数
常用如下:
更多请查看官方网址:https://docs.scipy.org/doc/numpy-1.14.0/reference/routines.random.html
1. rand(d0, d1, ..., dn)
返回数据在[0, 1)之间,具有均匀分布
2. randn(d0, d1, ..., dn)
返回数据具有标准正态分布(均值0,方差1)
3. randint(low[, high, size, dtype])
生成随机整数,包含low,不包含high
如果high不指定,则从[0, low)中生成数字
(ps:在python中random.randint(a,b) 是包含b的)
4. random([size])
生成[0.0, 1.0)的随机数
5. choice(a[, size, replace, p])
a是一维数组,从它里面生成随机结果
6. shuffle(x)
把一个数组x进行随机排列
7. permutation(x)
把一个数组x进行随机排列,或者数字的全排列
8. normal([loc, scale, size])
按照平均值loc和方差scale生成高斯分布的数字
9. uniform([low, high, size])
在[low, high)之间生成均匀分布的数字
实例:对数组加入随机噪声









































