numpy 中的 broadcasting 理解
broadcast 是 numpy 中 array 的一个重要操作。
首先,broadcast 只适用于加减。
然后,broadcast 执行的时候,如果两个 array 的 shape 不一样,会先给“短”的那一个,增加高维度“扩展”(broadcasting),比如,一个 2 维的 array,可以是一个 3 维 size 为 1 的 3维 array。
类似于: shape(1,3,2) = shape(3,2)
最后,比较两个 array(扩展后的),按照 dimension 从低到高,比较每一个维度的 size 是否满足下面两个条件之一:
1. 相等
2. 其中一个为 1
所以,举例,下列 array 是否可以进行 broadcast:
1. shape(4, 3) 与 shape(3,) :shape(3) 可以 broadcast 为 shape(1, 3),那么,从低到高: d0(3 === 3), d1(其中一个为 1)。结论,可以,结果的为 shape(4, 3)
2. shape(6,5,4,3, 与 shape(5, 4, 3):shape(5, 4, 3) 可以 broadcast 为 shape(1,5,4,3),那么,从低到高:d0( 3 === 3), d1(4 === 4), d2(5===5),d3(其中一个为 1)。结论,可以,结果为 shape(6, 5, 4, 3)。
3. shape(2,3) 与 shape(5,4,3):shape(2,3) 可以 broadcast 为 shape(1, 2, 3),那么,从低到高:d0( 3 == 3), d1(4!=2)。结论,不能进行 broadcast。
4. shape(4,1) 与 shape(5):shape(5)可以 broadcast 为 shape(1,5),那么,从低到高: d0( 其中一个为 1), d1(其中一个为 1)。结论,可以进行 broadcast,结果为 shape(4, 5) 。
broadcast 之后的运算是怎样呢?举例说明:
a = [ [0,1,2,], [4,5,6,] ] b = [1,2,3,] a + b = [ [1,3,5,], [5,7,9,] ]
或可自己运行下面代码观察
import numpy as np a = np.arange(12)
b = a.reshape(3,2,2) c = np.arange(4)
d = c.reshape(2, 2) e = np.arange(2) print d+b print e+b
还有下面一种特殊情况,即扩展低维度为 1 的情况下:
import numpy as np a = np.arange(3) b = np.arange(5) a = a[:, np.newaxis] print a
print b print a+b
基本上是只在对应的 dimension 进行加减,扩展的部分不参与运算。
numpy 中的 broadcasting 理解的更多相关文章
- 对numpy中shape的理解
from:http://blog.csdn.net/by_study/article/details/67633593 环境:Windows, Python3.5 一维情况: >>> ...
- [开发技巧]·Numpy中对axis的理解与应用
[开发技巧]·Numpy中对axis的理解与应用 1.问题描述 在使用Numpy时我们经常要对Array进行操作,如果需要针对Array的某一个纬度进行操作时,就会用到axis参数. 一般的教程都是针 ...
- 关于NumPy中数组轴的理解
参考原文链接(英文版):https://www.sharpsightlabs.com/blog/numpy-axes-explained/:中文版:https://www.jianshu.com/p/ ...
- 理解numpy中ndarray的内存布局和设计哲学
目录 ndarray是什么 ndarray的设计哲学 ndarray的内存布局 为什么可以这样设计 小结 参考 博客:博客园 | CSDN | blog 本文的主要目的在于理解numpy.ndarra ...
- Numpy中的广播机制,数组的广播机制(Broadcasting)
这篇文章把numpy中的广播机制讲的十分透彻: https://jakevdp.github.io/PythonDataScienceHandbook/02.05-computation-on-arr ...
- Numpy中Meshgrid函数介绍及2种应用场景
近期在好几个地方都看到meshgrid的使用,虽然之前也注意到meshgrid的用法.但总觉得印象不深刻,不是太了解meshgrid的应用场景.所以,本文将进一步介绍Numpy中meshgrid的用法 ...
- Python Pandas与Numpy中axis参数的二义性
Stackoverflow.com是程序员的好去处,本公众号将以pandas为主题,开始一个系列,争取做到每周一篇,翻译并帮助pandas学习者一起理解一些有代表性的案例.今天的主题就是Pandas与 ...
- Python numpy 中常用的数据运算
Numpy 精通面向数组编程和思维方式是成为Python科学计算大牛的一大关键步骤.——<利用Python进行数据分析> Numpy(Numerical Python)是Python科学计 ...
- numpy中array数组对象的储存方式(n,1)和(n,)的区别
资料:https://stackoverflow.com/questions/22053050/difference-between-numpy-array-shape-r-1-and-r 这篇文章是 ...
随机推荐
- python 全栈开发,Day43(python全栈11期月考题)
python全栈11期月考题 1.常用字符串格式化有哪些?并说明他们的区别 2.请手写一个单例模式(面试题) 3.利用 python 打印前一天的本地时间,格式为‘2018-01-30’(面试题) 4 ...
- 使用super调用父类的构造方法
package com.bjpowernode.t02inheritance.c09; /* * 使用super调用父类的构造方法 */public class TestSuper02 { publi ...
- 关于asp.net mvc中的httpModules 与 httpHandler
ASP.NET对请求处理的过程: 当请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给ASPNET_ISAPI.dll,A ...
- MyBatis之Hello world(Mybatis入门)
MyBatis中文网,超详细的:http://www.mybatis.org/mybatis-3/zh/index.html MyBatis英文网:http://www.mybatis.org/myb ...
- jQuery源码中的“new jQuery.fn.init()”什么意思?
所有文章搬运自我的个人主页:sheilasun.me 引子 最近打算试试看看jQuery的源码,刚开个头就卡住了.无论如何都理解不了jQuery源码入口部分中的 return new jQuery.f ...
- 线程池 多线程运行结束后 如何关闭? ExecutorService的正确关闭方法
前言 最近在使用ExecutorService的时候,对于与ExecutorService相关的概念有些迷糊, 加上本身ExecutorService内部的有些方法名在取名上也容易让使用者误解,导致 ...
- Educational Codeforces Round 26-D. Round Subset
题目大意:给你n个数字(小于1e18),从n个数中取k个数字相乘,使其后缀0最多,问你后缀0最多是多少. 知道得用三维的dp[ i ] [ j ] [ k ] 第一维表示用到第 i 个数为止,j 表 ...
- 63:二叉搜索树的第k个结点
/** * 面试题63:二叉搜索树的第k个结点 * 给定一颗二叉搜索树,请找出其中的第k大的结点 * 例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4. ...
- Smali语法
看阿里巴巴的<深入探索Android热修复>,里面的代码看不懂,一查才知道是Smali语法,百度了语法,转载如下 转载自smali 语言语法 1.smali apk文件通过apktool反 ...
- 对于pycharm和vscode下,从外部复制文本内容为python字符串内容是会自动加\u202a解决办法
先来看下这个python3源代码,表面上看没有语法毛病,如果源代码字符串内容是手动复制过来的文本内容,在pycharm和vscode下始终提示: pywintypes.error: (2, 'Shel ...