zoukankan      html  css  js  c++  java
  • numpy的broadcast是怎么做的

    其实大概是有下面4个原则.

    怎么判断能不能进行broadcast?

    从后往前对齐, 要么相同, 要么其中有一个是1. 官网上给了好几个例子. 比如3*1与1*4, 满足. 但如果是3*2与1*4, 那不行. 因为2与4不相同, 而且没有一个是1. 这个地方要是我说的不明白, 建议看官方文档给的例子.

    如果ndim不同怎么办?

    如果维数不同, 短的前面全补上1使得ndim相同, 比如说, 一个是2*3*4, 一个是4, 那么后者维数更少, 前面全补上1, 也就是1*1*4.

    broadcast后的形状如何?

    在做了上一步补齐ndim后, 每一个取max. 比如1*3与4*1. 那么就是(max(1,4),max(3,1)), 是(3,4).

    如果满足对齐规则, 怎么对齐?

    从右往左遇到的第一个1, 它右边有几维就跳出几层括号再开始拷贝, 并且是不带括号的拷贝. 画图吧.

    quiz: 怎么用broadcast得到每行相同/每列相同的矩阵?

    每行相同, 那么相当于是退了一层括号拷贝的, 那么1应该是出现在第1维(就是axis=0), 那么其实可以直接是向量. 每列相同, 那么没有退括号, 应该是列矩阵.

    quiz: 怎么得到outer sum? a,b=np.arange(1,5),np.arange(3,5), 想要4*2的矩阵.

    c[i][j]=a[i]+b[j], a需要broadcast为每列相同的, b需要为每行相同的矩阵. 因此如上说是a[,np.newaxis]+b.

  • 相关阅读:
    关于正则表达式
    hashilib模块和hmac模块
    PyYAML模块和ConfigParser模块
    xml处理模块
    shutil模块(文件,文件夹,压缩包处理)
    十四、浏览器检测
    十三、BOM
    十二、匿名函数和闭包
    并发,并行,同步,异步的区别
    java中常见的类,接口,包,异常
  • 原文地址:https://www.cnblogs.com/Tokubara/p/14221090.html
Copyright © 2011-2022 走看看