numpy数组运算、广播机制

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)不一致。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值