Numpy之广播

import numpy as np

一、介绍

当两个形状不同的数组进行运算,就会产生广播,这时两个数组会采取某种自然的方式进行扩展,使两个数组的形状相同,之后再参加运算。

二、广播的准则

  • 所有输入数组都向其中维数最多的数组看齐,shape属性中不足的部分通过在前面加1补齐(维度扩展);
  • 输出数组的shape属性是输入数组的shape属性的各个轴上的最大值
  • 如果输入数组的某个轴的长度为1或与输出数组的对应轴的长度相同,这个数组能够用来计算,否则出错;
  • 当输入数组的某个轴的长度为1时,沿着此轴运算时都用此轴上的第一组值;

三、图解示例

这里写图片描述

1.最上边一行就是形状相同的数组相加;

2.中间的一行

  • 第一个数组的shape为(4,3),第二个数组的shape为(1,3),故输出的shape为(4,3)
  • 沿轴为1的方向使用重复的方式进行扩展,使两个数组的形状相同

3.最后一行

  • 第一个数组的shape为(4,1),第二个数组的shape为(1,3),因为输出数组是所有轴上的最大值,故输出数组的shape为(4,3)
  • 第一个数组扩展为(4,3),第二个数组扩展为(4,3),最后进行运算

四、代码示例

创建二维数组a和一维数组b

a = np.arange(0,60,10).reshape(-1,1)
b = np.arange(0,5)
print(a.shape)
print(b.shape)
(6, 1)
(5,)

广播

# 由于b是一维数组,故在其shape属性的前面加1,将其转换为二维数组(1,5)。
# 此时a.shape为(6,1),b.shape为(1,5),则a+b的结果应该是(6,5);
c = a + b
print(c)
print(c.shape)
[[ 0  1  2  3  4]
 [10 11 12 13 14]
 [20 21 22 23 24]
 [30 31 32 33 34]
 [40 41 42 43 44]
 [50 51 52 53 54]]
(6, 5)

五、产生广播类型的数组:ogrid和mgrid

1.ogrid:产生两个不同维度的向量

# 产生两个向量,其shape分别为:(5,1)和(1,5)
x,y = np.ogrid[:5,:5]
print(x)
print(y)
[[0]
 [1]
 [2]
 [3]
 [4]]
[[0 1 2 3 4]]

2.mgrid:直接产生了ogrid中两个向量广播后的矩阵

x,y = np.mgrid[:5,:5]
print(x)
print(y)
[[0 0 0 0 0]
 [1 1 1 1 1]
 [2 2 2 2 2]
 [3 3 3 3 3]
 [4 4 4 4 4]]
[[0 1 2 3 4]
 [0 1 2 3 4]
 [0 1 2 3 4]
 [0 1 2 3 4]
 [0 1 2 3 4]]
x,y = np.ogrid[:1:4j,:1:3j]
print(x)
print(y)
[[ 0.        ]
 [ 0.33333333]
 [ 0.66666667]
 [ 1.        ]]
[[ 0.   0.5  1. ]]

六、将一维数组转换为更高维数组进行广播

1.新加轴法

x = np.array([0,1,4,10])
y = np.array([2,3,8])
print(x.shape)
print(y.shape)
print(x[None,:]+y[:,None])
(4,)
(3,)
[[ 2  3  6 12]
 [ 3  4  7 13]
 [ 8  9 12 18]]

2.ix_()函数可以自动扩充到可以进行运算的维度

gy,gx = np.ix_(y,x)
gx+gy
array([[ 2,  3,  6, 12],
       [ 3,  4,  7, 13],
       [ 8,  9, 12, 18]])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BQW_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值