Python的广播机制

原理

两个数组的后缘维度相同,或者在其中一方的维度为1。广播在缺失或者长度为1的维度上补充

举例说明

其中一方维度为1:A为(4,5)的三维数组,B为(4,1)的二维数组,两者维度相同,一个维度相同, 其中另外一个维度的其中一方为1,这种情况是可以进行广播的。

#维度相同,当其中一个维度相同,两个为维度其中一个为1时,可以进行广播
import numpy as np
a=np.array([[1,2,3],[4,5,6]])#2*3
print(f'a={a}\n')
b=np.array([[1],[3]])#2*1
print(f'b={b}\n')
c=a+b
print(f'c={c}')
d = a/b
print(f'd={d}')

  a.shape= (2,3),b.shape=(2,1),第一个维度相同,第二个维度其中一个为1,可以广播,b被广播成b1,b1.shape=(2,3),此时相当于 c=a+b1;同理d=a/b相当于a/b1


 后缘维度:A为(3,4,5)的三维数据,B为(4,5)的二维数组。由于A和B的后缘维度都为(4,5),所以可以进行广播机制。
同理:A为(3,4)的二维数组,B为(4,)的1为数组,他们的后缘维度都是4,所以可以进行广播。

#当A和B的后缘维度相同时,启动广播机制
a=np.array([[[1,2],[2,3],[3,4]],[[2,3],[4,5],[7,8]]])#2*3*2
b=np.array([[6,6],[7,7],[8,8]])#3*2
print(a.shape)
print(b.shape)
c=a+b
print(c)
print(c.shape)#相加后,c的结果是(2,3,2)

 

 a.shape=(2, 3, 2),b.shape =  (3, 2),

经常使用的例子

每一行除以每行的均值

import numpy as np
a=np.array([[1,2,3],[4,5,6]])#2*3
print(a/a.mean(axis =1,keepdims=1))

                                        ​​​​​​​        ​​​​​​​        ​​​​​​​        

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​         

         解释:keepdims=1使得保持二维,使得返回的每行均值数组如上所示,此时shape = (2,1),不然就是这个,此时的shape=(2,),此时a.shape=(2,3),满足其中一方维度为1的条件,均值被广播成

每一列除以每一列的均值

import numpy as np
a=np.array([[1,2,3],[4,5,6]])#2*3
a/a.mean(axis =0)

 

 这边没有keepdims=1,因为a.shape=(2,3),a.mean(axis=0).shape=(3,),,满足后缘维度相同的条件

当然也可以keepdims=1,结果相同

import numpy as np
a=np.array([[1,2,3],[4,5,6]])#2*3
a/a.mean(axis =0,keepdims=1)

此时a.shape=(2,3),a.mean(axis =0,keepdims=1).shape=(1,3),满足后缘维度相同的条件

所以建议使用上方两个例子的时候,建议keepdims=1

 

 

 

 

 

参考:

python的广播机制(broadcasting)_python中的broadcasting_ningyuanfeng的博客-CSDN博客

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python中实现广播机制通常使用多线程或者多进程的方式,其中多线程是较为常用的一种实现方式。 在多线程中,线程之间可以共享数据,因此可以将广播的消息存储在某个共享的数据结构中,例如队列或者列表。然后每个线程可以从该数据结构中读取消息,并根据消息的类型进行相应的处理。 下面是一个简单的 Python 广播机制的实现示例: ```python import threading class Broadcaster: def __init__(self): self.subscribers = [] self.lock = threading.Lock() def subscribe(self, subscriber): with self.lock: self.subscribers.append(subscriber) def unsubscribe(self, subscriber): with self.lock: self.subscribers.remove(subscriber) def broadcast(self, message): with self.lock: for subscriber in self.subscribers: subscriber.receive(message) class Subscriber: def __init__(self, name): self.name = name def receive(self, message): print(f"{self.name} received message: {message}") broadcaster = Broadcaster() subscriber1 = Subscriber("Subscriber 1") subscriber2 = Subscriber("Subscriber 2") subscriber3 = Subscriber("Subscriber 3") broadcaster.subscribe(subscriber1) broadcaster.subscribe(subscriber2) broadcaster.subscribe(subscriber3) broadcaster.broadcast("Hello World!") broadcaster.unsubscribe(subscriber2) broadcaster.broadcast("Goodbye World!") ``` 在上述示例中,`Broadcaster` 类实现了广播机制的核心逻辑,`Subscriber` 类则表示广播的订阅者。`Broadcaster` 类中维护了一个订阅者列表,每当广播一个消息时,就会遍历订阅者列表,将消息发送给每一个订阅者。订阅者可以通过 `receive` 方法接收到消息,并进行相应的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值