python⼴播机制是什么意思_Pythonnumpy⼴播机制不同形状的数组运算时,会进⾏⼴播处理
1,让所有输⼊数组都向其中维度最多的数组看齐,shape属性中不⾜的部分都通过在前⾯加1补齐
2,输出数组的shape属性是输⼊数组的shape属性的各个轴上的最⼤值
3,如果输⼊数组的某个轴的长度为1或与输出数组的对应轴的长度相同,这个数组能够⽤来计算,否则出错
4,当输⼊数组的某个轴的长度为1 时,沿着此轴运算时都⽤此轴上的第⼀组值
例1
import numpy as np
# -1表⽰该轴的数⽬⾃动计算
a = np.arange(0, 60, 10).reshape(-1, 1)
print(a)
print(a.shape)
# [[ 0]
# [10]
# [20]
# [30]
# [40]
# [50]]
# (6, 1)
b = np.arange(0, 5)
print(b)
print(b.shape)
# [0 1 2 3 4]
# (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)
由于a,b维数不同,根据规则1,需要让b的shape属性向a对齐,于是在b的shape属性前加1,变为(1,5)[[0 1 2 3 4]]
这样加法运算的两个输⼊数组的shape属性分别为(6,1)(1,5),根据规则2,输出数组的各个轴的长度为输⼊数组各个轴的长度的最⼤值,可知输出数组的shape属性为(6,5)
由于b的第0轴长度为1,⽽a的第0轴长度为6,为了能够让他们在第0轴上相加,需要将b的第0轴的长度扩展为6,相当于
b = np.arange(0, 5).reshape(1, 5)
bb = np.repeat(b, 6, axis=0)
print(bb)
print(bb.shape)
[[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]
[0 1 2 3 4]]
(6, 5)
由于a的第1轴的长度为1,⽽b的第⼀轴长度为5,需要将a的第⼀轴拓展为5,相当于
a = np.arange(0, 60, 10).reshape(-1, 1)
aa = a.repeat(5, axis=1)
print(aa)
print(aa.shape)
[[ 0 0 0 0 0]
[10 10 10 10 10]
[20 20 20 20 20]
[30 30 30 30 30]
[40 40 40 40 40]
[50 50 50 50 50]]
(6, 5)
这样a和b就能进⾏计算了
在计算时numpy并不会真的使⽤repeat进⾏拓展,这样太浪费内存空间了,由于这种⼴播计算很长⽤,使⽤ogrid对象创建⼴播计算数组
import numpy as np
x, y = np.ogrid[:5, :5]
print(x)
print(x.shape)
print(y)
print(y.shape)
[[0]
[1]
[2]
python获取数组长度[3]
[4]]
(5, 1)
[[0 1 2 3 4]]
(1, 5)
使⽤mgrid获取进⾏⼴播之后的数组
import numpy as np
x, y = np.mgrid[:5, :5]
print(x)
print(x.shape)
print(y)
print(y.shape)
[[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]]
(5, 5)
[[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]]
(5, 5)
ogrid和多维数组⼀样,⽤切⽚作为下标,返回的是⼀组可以⽤来⼴播计算的数组,其切⽚下标有两种形式1,开始值:结束值:步长,和np.arrange()类似
2,开始值:结束值:长度j,当第三个参数为虚数时,他表⽰返回的数组的长度,和linspace类似
可以很⽅便的绘制曲⾯图
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
x, y = np.ogrid[-2:2:20j, -2:2:20j]
z = x * np.exp(-x ** 2 - y ** 2)
# (20, 1) (1, 20) (20, 20)
print(x.shape, y.shape, z.shape)
figure = plt.figure()
ax = Axes3D(figure)
ax.plot_surface(x, y, z, rstride=1, cstride=1, cmap='rainbow') plt.show()

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。