张量(tensor)的广播

在使用numpy 对张量(数组)进行操作时,两个形状相同的张量进行加减等运算很容易理解,那么不同形状的张量之间的运算是通过广播来实现的。广播实际上很简单,但是弄清楚是也花了不小功夫,这里记录一下。

广播的目的是将两个不同形状的张量 变成两个形状相同的张量,即先对小的张量添加轴(使其ndim与较大的张量相同),在把较小的张量沿着新轴重复(使其shape与较大的相同)

广播的的限制条件为:两个张量的 trailing dimension(从后往前算起的维度)的轴长相等 或 其中一个的长度为1

复制代码
import numpy as np
a=np.arange(0,12)
a=a.reshape(3,4)
b=np.arange(0,4)
print(a)
#[[ 0  1  2  3]
#  [ 4  5  6  7]
# [ 8  9 10 11]]

print(b)
#[0 1 2 3]

print(a.shape)
#(3, 4)

print(b.shape)
#(4,)

print(a.ndim)
#2
print(b.ndim)
#1

a+b          

#array([[ 0,  2,  4,  6],
#       [ 4,  6,  8, 10],
#       [ 8, 10, 12, 14]])  
复制代码

上述 a+b 的计算过程等价为:

(1)先将b添加一个轴 即

(2)在将b沿着 新加的轴进行重复  

复制代码
 b.reshape(1,4)
#array([[0, 1, 2, 3]])

c=np.array([b,b,b])
#array([[0, 1, 2, 3],
#      [0, 1, 2, 3],
#      [0, 1, 2, 3]])

a+c

#array([[ 0,  2,  4,  6],
#       [ 4,  6,  8, 10],
#       [ 8, 10, 12, 14]])
复制代码

 

其他几个例子

复制代码
x=np.arange(0,12)
x=x.reshape(3,4,1)
x
y=np.arange(0,8)
y=y.reshape(4,2)
y
q=x+y
q.shape
#(3,4,2)
复制代码
复制代码
x=np.arange(0,12)
x=x.reshape(3,4,1)
x
z=np.arange(0,2)
z=z.reshape(1,2)
z
q=x+z
q.shape
#(3,4,2)
复制代码

x  :      y z  x+y    x+z  

 

 

 

最后放上几个图片便于理解

 

posted @   Assist  阅读(2131)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示