[Python数据科学手册]2.5广播

248 阅读2分钟
#广播:用于不同大小数组的二进制通用函数的一组规则

import numpy as np 
a = np.array([0,1,2]) #array数组
b = np.array([5,5,5])
a + b
a + 5

M = np.ones((3,3))
M
M + a

a = np.arange(3)
b = np.arange(3)[:,np.newaxis]
a
b
a + b
#这里将 a 和 b 都进行了扩展来匹配一个公共的形状,
#最终的结果是一个二维数组。

# 规则 1:如果两个数组的维度数不相同,那么小维度数组的形状将 会在最左边补 1。 
# 规则 2:如果两个数组的形状在任何一个维度上都不匹配,
# 那么数组的形状会沿着维度为 1 的维度扩展以匹配另外一个数组的形状。 
# 规则 3:如果两个数组的形状在任何一个维度上都不匹配并且没有任何一个维度等于 1,那么会引发异常

#示例1
M = np.ones((2,3))
a = np.arange(3)
M.shape
a.shape
M + a 

#示例2
a = np.arange(3).reshape((3,1))
b = np.arange(3)
a.shape
b.shape
a
b
a + b

#不兼容
M = np.ones((3,2))
a = np.arange(3)
M.shape
a.shape
M
a
M + a
a[:,np.newaxis].shape
M + a[:,np.newaxis]
#用logaddexp(a,b)比log(exp(a)+exp(b))更准确
np.logaddexp(M,a[:,np.newaxis])

#广播的实际应用

#1数组的归一化
#假设有一个有10个观察值的数组,每个观察值包含3个数值
X = np.random.random((10,3))
X
Xmean = X.mean(0) #利用mean函数沿着第一个维度聚合
Xmean #竖着算的,一列的均值
X_centered = X - Xmean #从 X 数组的元素中减去这个均值实现归一化
#为了进一步核对我们的处理是否正确,可以查看归一化的数组的均 值是否接近0
X_centered.mean(0) 

#2画一个二维函数
x = np.linspace(0,5,50)
y = np.linspace(0,5,50)[:,np.newaxis]
z = np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)
# %matplotlib inline
import matplotlib.pyplot as plt 
plt.imshow(z,origin='lower',extent=[0,5,0,5],cmap='viridis')
plt.colorbar()

# %matplotlib inline
# 一般是在jupyter notebook中经常用到,如果看到这个说明这个是用jupyter编辑的
# %matplotlib具体的作用是当调用matplotlib.pyploy的会画函数plot()进行绘图的时候,
# 或者生成一个figure画布的时候,可以直接在你的python console里面生成画布

  • 规则 1:如果两个数组的维度数不相同,那么小维度数组的形状将会在最左边补 1。
  • 规则 2:如果两个数组的形状在任何一个维度上都不匹配,那么数组的形状会沿着维度为 1 的维度扩展以匹配另外一个数组的形状。
  • 规则 3:如果两个数组的形状在任何一个维度上都不匹配并且没有任何一个维度等于 1,那么会引发异常。
  • X[:,0]就是取所有行的第0个数据, X[:,1] 就是取所有行的第1个数据。