1、单一元素与数组计算
在数组的数学运算中,可以用单一元素与数组相乘,计算规则为该元素与数组中每一个元素分别相乘,得到新数组中相应位置的元素,如下:
import numpy as np
x = np.random.randint(1,8,(3,2))
y = 4
z = x * y
print("x=",x)
print("y=",y)
print("z=",z)
#输出
x= [[6 5]
[5 6]
[2 7]]
y= 4
z= [[24 20]
[20 24]
[ 8 28]]
2、维度相同的数组计算
当两个数组维度相同时,计算结果为两数组对应位置元素做计算,如下:
import numpy as np
x = np.random.randint(1,8,(3,2))
y = np.random.randint(1,8,(3,2))
z = x * y
print("x=",x)
print("y=",y)
print("z=",z)
#输出
x= [[7 4]
[1 7]
[1 6]]
y= [[7 4]
[5 6]
[1 7]]
z= [[49 16]
[ 5 42]
[ 1 42]]
3、不同维度数组计算
如果两数组维度不一样时,在某些情况下,仍然可以计算,看几个实验
(1)、两个数组都有相同的维度,但是某一维度元素个数不一样,可以看到最终输出shape为(3, 2),注意这里y的第二个维度为1,但第二次实验y的维度不为1
import numpy as np
x = np.random.randint(1,8,(3,2))
y = np.random.randint(1,8,(3,1))
z = x * y
print("x=",x)
print("y=",y)
print("z=",z)
# 输出
x= [[2 7]
[6 2]
[1 7]]
y= [[6]
[6]
[3]]
z= [[12 42]
[36 12]
[ 3 21]]
import numpy as np
x = np.random.randint(1,8,(3,2))
y = np.random.randint(1,8,(3,3))
z = x * y
print("x=",x)
print("y=",y)
print("z=",z)
(2)、维度不同的两数组,最终输出shape为(2,3,2)
import numpy as np
x = np.random.randint(1,8,(3,2))
y = np.random.randint(1,8,(2,3,2))
z = x * y
print(“x=”,x)
print(“y=”,y)
print(“z=”,z)
```bash
x= [[6 4]
[4 1]
[2 1]]
y= [[[5 2]
[1 6]
[7 3]]
[[2 6]
[7 5]
[5 2]]]
z= [[[30 8]
[ 4 6]
[14 3]]
[[12 24]
[28 5]
[10 2]]]
通过上面两个实验,可以知道(这就是numpy的广播机制)
当维度相同时,输出shape为
(max( x.shape[0], y.shape[0]), max(x.shape[1], y.shape[1] ), … , max(x.shape[n],y.shape[n]))
但是两数组元素个数不同的维度必须有一个为1
当维度不相同时,维度较少的数组直接增加维度,比如第二个实验,x的维度会变为(2,3,2),再与y进行数值计算
需要注意的是,在做数组运算的时候,如果有触发广播机制,则不能覆盖做运算的数组。如图,要把x+y的值赋给x,程序会报错,这是因为两个数组触发广播机制之后运算结果的维度(3,3,3,2)和被赋值的数组维度(3,3,3,1)不一致。