Numpy

Numpy(Numerical Python)是一个开源的Python科学计算库,用于快速处理任意维度的数组。

Numpy支持常见的数组和矩阵操作。对于同样的数值计算任务,使用Numpy比直接使用Python要简洁的多。

Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器。

Numpy专门针对ndarray的操作和运算进行了设计,所以数组的存储效率和输入输出性能远优于Python中的嵌套列表,数组越大,Numpy的优势就越明显。


从图中我们可以看出ndarray在存储数据的时候,数据与数据的地址都是连续的,这样就给使得批量操作数组元素时速度更快。

这是因为ndarray中的所有元素的类型都是相同的,而Python列表中的元素类型是任意的,所以ndarray在存储元素时内存可以连续,而python原生list就只能通过寻址方式找到下一个元素,这虽然也导致了在通用性能方面Numpy的ndarray不及Python原生list,但在科学计算中,Numpy的ndarray就可以省掉很多循环语句,代码使用方面比Python原生list简单的多。

简而言之就是,ndarray在使用元素的时候是直接取元素本身。而python内取元素是先取到元素内存地址,再通过元素内存地址取到元素本身,所以ndarray的运算速度会比python快,这是原因之一,而且ndarray可以并行运算。
这样的不便之处就在,ndarray所储存的一系列元素必须是同类型的,而python由于是通过内存地址取到元素,所以可以储存各种类型的元素。

1 ndarray的属性

数组属性反映了数组本身固有的信息。

创建数组的时候指定类型,若不指定,整数默认int64,小数默认float64。

基本操作

导包:import numpy as np

1.生成数组的方法

1.1 生成0和1的数组
np.ones(shape[, dtype, order])
shape: 形状
dtype: 元素的数据类型, 默认np.float64
order: 存储数据的风格, 行优先('C'), 列优先('F') 默认是'C'
生成指定形状的全1数组

例:

# in
ones = np.ones([3,4],dtype=np.int32)
ones
# out
array([[1, 1, 1, 1],[1, 1, 1, 1],[1, 1, 1, 1]], dtype=int32)
np.ones_like(a[, dtype, order, subok])
根据已有数组的形状生成全1数组
np.zeros(shape[, dtype, order])
生成指定形状的全0数组
np.zeros_like(a[, dtype, order, subok])
根据已有数组的形状生成全0数组

# 根据已有数组的形状生成全0的数组
# in
zeros = np.zeros_like(ones,dtype=np.float64)
zeros
# out
array([[0., 0., 0., 0.],[0., 0., 0., 0.],[0., 0., 0., 0.]])

注:order属性解释
order: 存储数据的风格, 行优先(‘C’), 列优先(‘F’) 默认是’C’
什么是行优先什么是列优先?
指的是数组数据在存储的时候是按行依次存储还是按列依次存储
例如:有一个数组
arr = np.array([[1,2,3],[4,5,6]])
打印出来是这样的
array([[1,2,3],
[4,5,6]])
行优先表示存储到储存空间的时候是按行存储

列优先表示存储到储存空间的时候是按列存储

1.2 从现有数组生成

1.2.1 生成方式
np.array(object[, dtype, copy, order, subok, ndmin])

数组深拷贝
np.asarray(a[, dtype, order])

数组浅拷贝

a = np.array([[1,2,3],[4,5,6]])
# np.array  创建新的存储空间,把数据拷贝到新的存储空间中
a1 = np.array(a)
# np.asarray  没有创建新的存储空间,返回了指向原数据的地址
a2 = np.asarray(a)

示例

1.3 生成固定范围的数组
np.linspace (start, stop, num, endpoint)
生成等间隔的序列
start 序列的起始值
stop 序列的终止值,
num 要生成的等间隔样例数量,默认为50
endpoint 序列中是否包含stop值,默认为ture用于指定是否包含最后一个数,默认是True
# 生成等间隔的数组
# 表示从0到100生成11个等间隔的数(0-100有101个数)
np.linspace(0, 100, 11)
返回结果:array([  0.,  10.,  20.,  30.,  40.,  50.,  60.,  70.,  80.,  90., 100.])

其它的还有

 numpy.arange(start,stop, step, dtype)类似于Python中的range方法
# 表示从10到50以步长2依次生成数
np.arange(10, 50, 2)
返回结果:array([10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42,44, 46, 48])
numpy.logspace(start,stop, num)
 生成数组,第一个是10^{start},最后一个是10^{stop},形成总数为num个元素的等比数列# 生成10^x
np.logspace(0, 2, 3)
返回结果:array([  1.,  10., 100.])
1.4 生成随机数组
1.4.1 使用模块介绍
np.random模块
1.4.2 均匀分布
np.random.rand(d0, d1, ..., dn)参数: d0, d1, ..., dn : int, 可选, 生成数组的维度, 如果没有指定, 返回一个[0.0,1.0)的数.
参数指定维度,和shape类似

返回[0.0,1.0)内的一组均匀分布的数。

np.random.uniform(low=0.0, high=1.0, size=None)功能:从一个均匀分布[low,high)中随机采样,注意定义域是左闭右开,即包含low,不包含high.

参数介绍:

low: 采样下界,float类型,默认值为0;high: 采样上界,float类型,默认值为1;size: 输出样本数目,为int或元组(tuple)类型,例如,size=(m,n,k), 则输出mnk个样本,缺省时输出1个值。返回值:ndarray类型,其形状和参数size中描述一致。
np.random.randint(low, high=None, size=None, dtype='l')从一个均匀分布中随机采样,生成一个整数或N维整数数组,取数范围:若high不为None时,取[low,high)之间随机整数,否则取值[0,low)之间随机整数。

示例:

# 生成均匀分布的随机数
x1 = np.random.uniform(-1, 1, 100000000)
返回结果:array([ 0.22411206,  0.31414671,  0.85655613, ..., -0.92972446,
0.95985223,  0.23197723])
1.4.3 正态分布
1.4.3.1 基础概念复习:正态分布(理解)

a. 什么是正态分布
正态分布是一种概率分布。正态分布是具有两个参数μ和σ的连续型随机变量的分布,第一参数μ是服从正态分布的随机变量的均值,第二个参数σ2\sigma^2σ2
​​ 是此随机变量的方差,所以正态分布记作 N(μ,σ2)N(\mu, \sigma^2)N(μ,σ2)。


b. 正态分布的应用
生活、生产与科学实验中很多随机变量的概率分布都可以近似地用正态分布来描述。

c. 正态分布特点
μ决定了其位置,其标准差σ决定了分布的幅度。当μ = 0,σ = 1时的正态分布是标准正态分布。


标准差如何来?

方差
是在概率论和统计方差衡量一组数据时离散程度的度量


其中M为平均值,n为数据总个数,S为标准差,S2S^2S2
​​ 可以理解一个整体为方差

标准差与方差的意义
可以理解成数据的一个离散程度的衡量
例如红色点为均值,蓝点为数据值,当方差越小,蓝点就越聚合于红点,当方差越大,则表明数据越离散。

1.4.3.2 正态分布创建方式
np.random.randn(d0, d1, …, dn)
功能:从标准正态分布中返回一个或多个样本值
np.random.normal(loc=0.0, scale=1.0, size=None)
loc:float​ 此概率分布的均值(对应着整个分布的中心centre)scale:float​ 此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高)size:int or tuple of ints​ 输出的shape,默认为None,只输出一个值
np.random.standard_normal(size=None)
返回指定形状的标准正态分布的数组。

例:

x2 = np.random.normal(1.75, 1, 100000000)
返回结果:array([2.90646763, 1.46737886, 2.21799024, ..., 1.56047411, 1.87969135,0.9028096 ])
# 生成均匀分布的随机数
x2 = np.random.normal(1.75, 1, 100000000)# 画图看分布状况
# 1)创建画布
plt.figure(figsize=(20, 10), dpi=100)# 2)绘制直方图
plt.hist(x2, 1000)# 3)显示图像
plt.show()

案例:随机生成8只股票2周的交易日涨幅数据
8只股票,两周(10天)的涨跌幅数据,如何获取?两周的交易日数量为:2 X 5 =10
随机生成涨跌幅在某个正态分布内,比如均值0,方差1
股票涨跌幅数据的创建
# 创建符合正态分布的8只股票10天的涨跌幅数据stock_change = np.random.normal(0, 1, (8, 10))
stock_change

2 数组的索引、切片

# 注意,切片是包含头不包含尾的,如共有10条数据,下标为0-9,若取前5条,[0:4]只取到了0-3
获取第一个股票的前3个交易日的涨跌幅数据
# 二维的数组,两个维度
stock_change[0, 0:3]
返回结果:array([-0.03862668, -1.46128096, -0.75596237])
一维、二维、三维的数组如何索引?# 三维,一维
a1 = np.array([ [[1,2,3],[4,5,6]], [[12,3,34],[5,6,7]]])
# 返回结果
array([[[ 1,  2,  3],[ 4,  5,  6]],[[12,  3, 34],[ 5,  6,  7]]])
# 索引、切片
>>> a1[0, 0, 1]   # 输出: 2
3 形状修改

让刚才的股票行、日期列反过来,变成日期行,股票列

ndarray.reshape(shape[, order]) Returns an array containing the same data with a new shape.# reshape 把数组修改为制定的形状,但元素的顺序并没有发生改变;返回新形状后的数组,原数组没有发生改变
# 如原来数组本来是8行10列,reshape 的原理是保持原数据顺序不变,第一行读完8个数据后,剩下两行数据留到下一行读
stock.reshape(10,8)
# 在转换形状的时候,一定要注意数组的元素匹配
# 当新生成数组元素个数大于或小于原数组时,会报错
stock_change.reshape([10, 8])
stock_change.reshape([-1,20])  # 数组的形状被修改为: (4, 20), -1: 表示通过待计算
ndarray.resize(new_shape[, refcheck]) Change shape and size of array in-place.
# resize,修改形状的方法是一样的,但不会返回新数组,而是修改原来的数组,整体元素的顺序没有发生改变,只是数组的形状变了
stock_change.resize([10, 8])
ndarray.T 数组的转置
将数组的行、列进行互换
stock_change.shape
(10, 8)
stock_change.T.shape
(8, 10)
4 类型修改
ndarray.astype(type)
stock_change.astype(np.int32)
ndarray.tostring([order])或者ndarray.tobytes([order]) Construct Python bytes containing the raw data bytes in the array.
转换成bytes
# 把数组对象,转换为二进制字符串
arr = np.array([[[1, 2, 3], [4, 5, 6]], [[12, 3, 34], [5, 6, 7]]])
arr.tostring()

拓展:如果遇到

IOPub data rate exceeded.The notebook server will temporarily stop sending outputto the client in order to avoid crashing it.To change this limit, set the config variable`--NotebookApp.iopub_data_rate_limit`.

这个问题是在jupyer当中对输出的字节数有限制,需要去修改配置文件

创建配置文件

jupyter notebook --generate-config
vi ~/.jupyter/jupyter_notebook_config.py
取消注释,多增加## (bytes/sec) Maximum rate at which messages can be sent on iopub before they
#  are limited.
c.NotebookApp.iopub_data_rate_limit = 10000000

但是不建议这样去修改,jupyter输出太大会崩溃

5 数组的去重
np.unique()
# 不改变原数组,返回去重后的一维数组,不论是几维数组,返回的都是一维数组
temp = np.array([[1, 2, 3, 4],[3, 4, 5, 6]])
>>> np.unique(temp)
array([1, 2, 3, 4, 5, 6])

numpy相关介绍和基本操作相关推荐

  1. 阿里MNN推理框架相关介绍

    一.参考资料 MNN官网 中文文档-语雀 欢迎使用MNN文档 - MNN-Doc 2.1.1 documentation) 英文文档 MNN知识库 MNN 官方仓库 二.相关介绍 1. MNN简介 M ...

  2. 复杂网络鲁棒性以及节点攻击(随机攻击、蓄意攻击)的相关介绍与代码程序实现

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.鲁棒性是什么?如何实现节点攻击? 二.攻击过程与代码实现 引入库 三.利用程序攻击结果展示 前言 随着复杂网络理论 ...

  3. Numpy的介绍和优势

    Numpy的介绍和优势 1 Numpy介绍 Numpy(Numerical Python)是一个开源的Python科学计算库,用于快速处理任意维度的数组. Numpy支持常见的数组和矩阵操作.对于同样 ...

  4. pthread相关介绍

    pthread相关介绍 int pthread_create(pthread_t *tid, const pthread_attr_t *attr, void*(*start_routine)(voi ...

  5. axios队列 vue_(十三 )Vue 封装axios(四种请求)及相关介绍

    Vue 封装axios(四种请求)及相关介绍 首先axios是基于promise的http库 promise是什么? 1.主要用于异步计算 2.可以将异步操作队列化,按照期望的顺序执行,返回符合预期的 ...

  6. python映射类型-python映射类型的相关介绍

    映射类型是一类可迭代的键-值数据项的组合,提供了存取数据项及其键和值的方法,在python3中,支持两种无序的映射类型:内置的dict和标准库中的collections.defaultdict类型. ...

  7. python numpy库安装-Python Numpy库安装与基本操作示例

    本文实例讲述了Python Numpy库安装与基本操作.分享给大家供大家参考,具体如下: 概述 NumPy(Numeric Python)扩展包提供了数组功能,以及对数据进行快速处理的函数. NumP ...

  8. Android Pmem相关介绍

    http://fangjian0518.blog.163.com/blog/#m=0 Android Pmem相关介绍 2011-10-18 09:40:26|  分类: Android PMEM | ...

  9. Android O 前期预研之二:HIDL相关介绍

    在上一篇博客里,大致介绍了下Android O 中treble计划的一些背景与相关基本架构,这一篇中跟大家一起来探讨下HIDL相关的内容. Android HAL类型  在此之前的ANDROID版本当 ...

  10. 程序如何在两个gpu卡上并行运行_深度学习分布式训练相关介绍 - Part 1 多GPU训练...

    本篇文章主要是对深度学习中运用多GPU进行训练的一些基本的知识点进行的一个梳理 文章中的内容都是经过认真地分析,并且尽量做到有所考证 抛砖引玉,希望可以给大家有更多的启发,并能有所收获 介绍 大多数时 ...

最新文章

  1. 自建MySQL和阿里云RDS的区别 有必要使用云数据库吗?...
  2. python数值运算实例_Python矩阵常见运算操作实例总结
  3. 新手搭建简洁的Express-React-Redux脚手架
  4. vim在退出时,处理隐藏缓冲区的方式
  5. Go 语言的包依赖管理
  6. android获取毫秒,Android 日期转为为毫秒,毫秒转化为日期,获取当期日期年、月、日...
  7. 北风网php笔记正则表达式,PHP中使用正则表达式提取中文实现笔记
  8. 双机通信c语言程序,上传一个自己编写的I2C双机通信程序
  9. Python 数据可视化:WordCloud 词云的构建
  10. java是值调用_Java 只有值调用
  11. 【华为云实战开发】14.如何使用Node爬虫利器Puppteer进行自动化测试
  12. .net core精彩实例分享 -- 文件与I/O
  13. mybatis-generator
  14. centos7 安装postgresql10
  15. Maven实战读书笔记
  16. python数据分析挖掘与可视化课件_python数据分析与可视化
  17. 办理ICP证、SP证、BBS证及非经营性网站(ICP)备案常见问题解答
  18. 2020CCPC绵阳D.Defuse the Bombs(二分)
  19. 2020 JAVA eclipse 中文汉化包 安装教程--傻瓜式操作
  20. 笔记本onenote绘画快捷键_onenote快捷键

热门文章

  1. Ubuntu桌面版以太网无法设置IP
  2. oracle里的ols机制,[Oracle] 数据库安全之 - Oracle标签安全(OLS)
  3. Java数字转中文数字
  4. python一张纸超过8848_「一张纸的厚度」JavaScript问题:一张纸的厚度是0.0001米,将纸对折,对折多少次厚度超过珠峰高度8848米 - seo实验室...
  5. 寒冰老师 计算机 山西,计算机科学与技术口号, 计算机培训小组口号
  6. python 协程加多线程下载asyncio、ThreadPoolExecutor
  7. 效果惊人:上古卷轴III等经典游戏也能使用超分辨率GAN重制了
  8. 结合可变形注意力的视觉Transformer
  9. Ubuntu 20.04无法连接网络(网络图标丢失)的解决方案
  10. 《精通git》笔记之九(储藏与清理、签署工作、搜索)