python科学计算_numpy_广播与下标
多维数组下标
多维数组的下标是用元组来实现每一个维度的,如果元组的长度比维度大则会出错,如果小,则默认元组后面补 : 表示全部访问;
如果一个下标不是元组,则先转换为元组,在转换过程中,列表和数组的转换有所不同。
一个列表会被转换成各个元素组成的元组,然后进行访问(此时如果不全为整数的话,则不会共享存储区域,因为无法通过改变步长来保持存储结构不变);如:lidx=[[0],[1],[2]];如果用lidx来访问一个数组,则会被转换成:([0],[1],[2]),即访问(0,1,2)上的元素;
一个数组会进行补 : 操作转成长度一致的元组,如三维数组a:
array([[[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]],
[[20, 21, 22, 23, 24],
[25, 26, 27, 28, 29],
[30, 31, 32, 33, 34],
[35, 36, 37, 38, 39]],
[[40, 41, 42, 43, 44],
[45, 46, 47, 48, 49],
[50, 51, 52, 53, 54],
[55, 56, 57, 58, 59]]])
如果使用一个数组来访问:aidx=np.array([[0],[1],[2]]):
array([[0],
[1],
[2]])
则会被补全为:(aidx,:,:),访问结果为:
array([[[[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]]],
[[[20, 21, 22, 23, 24],
[25, 26, 27, 28, 29],
[30, 31, 32, 33, 34],
[35, 36, 37, 38, 39]]],
[[[40, 41, 42, 43, 44],
[45, 46, 47, 48, 49],
[50, 51, 52, 53, 54],
[55, 56, 57, 58, 59]]]])
结果的形状是访问下标数组的形状和原数组形状的组合:原数组形状为(3,4,5),下标数组形状为:(3,1);访问得到的数组形状为:(3,1,4,5);访问数组在0轴位置替代原数组形状;
相当于a(aidx,:,:),如果访问:a(:,aidx,:),则访问的形状应该为(3,3,1,5),即在1轴位置替代原数组形状;
广播
再复习一下广播,详细规则见随笔:http://www.cnblogs.com/lyon2014/p/4696989.html
如上例的a数组,a.shape = (3,4,5),如果使用数组来访问,则会在对应的位置替代原数组的形状,如果下标中有多个数组,且形状不一致,则会进行广播,如:
i0 = np.array([[1,2,1],[0,1,0]]) , i0.shape=(2,3)
i1 = np.array([[[0]],[[1]]]), i1.shape=(2,1,1)
i2 = np.array([[[2,3,2]]]), i2.shape=(1,1,3)
按照广播的规则,i0的维数比最大维数3少,进行补1操作得到新的形状为:(1,2,3),再比较各个轴的长度:
1 2 3
2 1 1
1 1 3
--------
2 2 3
最后结果的形状为(2,2,3),且满足第三条规则,可以进行计算;广播后的三个数组(记为:ind0,ind1,ind2)为:
ind0:
array([[[1, 2, 1],
[0, 1, 0]],
[[1, 2, 1],
[0, 1, 0]]])
ind1:
array([[[0, 0, 0],
[0, 0, 0]],
[[1, 1, 1],
[1, 1, 1]]])
ind2:
array([[[2, 3, 2],
[2, 3, 2]],
[[2, 3, 2],
[2, 3, 2]]])
此时,使用广播后的三个数组访问数组a(i0,i1,i2),得到的数组形状应该只与下标数组有关,即广播后的数组形状:(2,2,3);
如果a使用其中的两个数组访问:a(:,i0,i1),由于i0和i1广播后的形状为 (2,2,3),在1、2轴替换a数组的形状,最后得到的形状为:(3,2,2,3);
如果a使用其中两个数组访问,并且两个数组不连续:a(i0,:,i1),则第二轴会作为最后一维,即形状应该为广播后形状加上切片轴的形状:(2,2,3,4)
布尔数组作为下标
布尔数组作为下标时,相当于用nonzero()处理后的元组作为下标;
如:b2 = np.array([[True,False,True],[True,False,False]]) 作为下标,相当于:
np.nonzero(b2) = (array([0, 0, 1]), array([0, 2, 0]))
a[b2] = a[np.nonzero(b2)] = a[ array([0, 0, 1]), array([0, 2, 0]), : ], 前两轴由于作为元组访问,最后得到的形状为(3,),最后访问到的形状为:(3,5)
python科学计算_numpy_广播与下标的更多相关文章
- python科学计算_numpy_函数库
1.常规函数与排序 常用统计函数: 求和:sum().均值:mean().标准差:std().方差:var().最小值:min().最大值:max().最大值与最小值之差:ptp().最大值的下标:a ...
- python科学计算_numpy_线性代数/掩码数组/内存映射数组
1. 线性代数 numpy对于多维数组的运算在默认情况下并不使用矩阵运算,进行矩阵运算可以通过matrix对象或者矩阵函数来进行: matrix对象由matrix类创建,其四则运算都默认采用矩阵运算, ...
- Python科学计算库
Python科学计算库 一.numpy库和matplotlib库的学习 (1)numpy库介绍:科学计算包,支持N维数组运算.处理大型矩阵.成熟的广播函数库.矢量运算.线性代数.傅里叶变换.随机数生成 ...
- Python科学计算基础包-Numpy
一.Numpy概念 Numpy(Numerical Python的简称)是Python科学计算的基础包.它提供了以下功能: 快速高效的多维数组对象ndarray. 用于对数组执行元素级计算以及直接对数 ...
- Python科学计算库Numpy
Python科学计算库Numpy NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库. 1.简 ...
- windows下安装python科学计算环境,numpy scipy scikit ,matplotlib等
安装matplotlib: pip install matplotlib 背景: 目的:要用Python下的DBSCAN聚类算法. scikit-learn 是一个基于SciPy和Numpy的开源机器 ...
- Python科学计算(二)windows下开发环境搭建(当用pip安装出现Unable to find vcvarsall.bat)
用于科学计算Python语言真的是amazing! 方法一:直接安装集成好的软件 刚开始使用numpy.scipy这些模块的时候,图个方便直接使用了一个叫做Enthought的软件.Enthought ...
- 目前比较流行的Python科学计算发行版
经常有身边的学友问到用什么Python发行版比较好? 其实目前比较流行的Python科学计算发行版,主要有这么几个: Python(x,y) GUI基于PyQt,曾经是功能最全也是最强大的,而且是Wi ...
- Python科学计算之Pandas
Reference: http://mp.weixin.qq.com/s?src=3×tamp=1474979163&ver=1&signature=wnZn1UtW ...
随机推荐
- 第四届河南省ACM 表达式求值 栈
表达式求值 时间限制: 1 Sec 内存限制: 128 MB 提交: 14 解决: 7 [提交][状态][讨论版] 题目描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简 ...
- PHP能引起安全的函数
php中需要禁用以下函数来提高安全性 打开php.ini 找到 disable_functions .然后禁用以下函数 disable_functions = pcntl_alarm, pcntl_ ...
- mysql--二进制日志(bin-log)三种格式介绍及分析
一.Mysql binlog日志有三种格式,分别为ROW.Statement以及MiXED.Row LevelBinary Log会记录成[每一行数据被修改的形式],然后在Slave端再对相同的数据进 ...
- UWP 使用OneDrive云存储2.x api(一)【全网首发】
最近开发人脸识别UWP[微识别 / Werecognition]用到了OneDrive开发,下面把来龙去脉讲一下. 下载地址 https://www.microsoft.com/store/produ ...
- jq,返回上一页,小记history.back(-1)和history.go(-1)区别
<input type="button" name="back" value="重新填写" onclick="javascr ...
- YiShop_商城网站建设应该注意什么
现在电子商务迅速发展,而专门搭建商城网站的第三方开发商也很多.现在搭建一个商城网站容易,如何运营一个商城网站才是重点.下面就由YiShop说说电子商城网站建设要思考什么呢(1)建设网站的目的是什么首先 ...
- Redis的简单使用和介绍
1.什么是NoSQL NoSQL = Not Only SQL 非关系型的数据库 2. 为什么需要NoSQL High performance 高并发读写 ...
- Docker笔记三:基于LVS DR模式构建WEB服务集群
安装ipvsadm 1. 先在宿主机上安装并以root来启动ipvsadm,每次要在容器中运行ipvs都需要先在宿主机上启动ipvs.如果直接进行2步操作将报出如下错误: Can't initiali ...
- 关于Oracle处理DDL和DML语句的事务管理
SQL主要程序设计语言 数据定义语言DDL(Data Definition Language) 如 create.alter.drop, 数据操作语言DML(Data Munipulation Lan ...
- Maste Note for OCR / Vote disk Maintenance Operations (ADD/REMOVE/REPLACE/MOVE)
Doc ID 428681.1 Applies to: Oracle Database - Enterprise Edition - Version 10.2.0.1 to 11.2.0.1.0 [R ...