Py学习  »  Python

在对多维数组求和时理解python的“冒号运算符”

Bastian • 5 年前 • 1506 次点击  

我有一个可能很简单的问题,就是在对多维数组执行数学运算时,如何理解冒号运算符。

下面是两个我对实际发生的事情感到困惑的例子:

dx[:,r:H,c:W] += dout[depth, r, c] * w[depth,:,:,:]

在本例中,我们处理的是一个数组 dx 形状的 (channels, height, width) . 例如rgb图像。 dout 是相似的,但是通道、行和列的数量不同于 DX . w 有形状 (num, channels, height, width) 哪里 channels 等于 渠道 在里面 DX . 杜特 渠道 等于 W num .

dw[depth,:,:,:] += dout[depth,r,c] * x[:,r:r+HH,c+WW]

在这里 dw 形状与 W 从上一个例子。 杜特 也可以从前面的示例中得知。 x 类似于 杜特 但它是 渠道 等于 数据仓库 渠道 .

我知道在执行这样的操作时,单个值会发生什么。我的意思是,这通常只是不同张量之间的卷积,但是我现在很困惑如何用for循环来表达。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/41007
 
1506 次点击  
文章 [ 1 ]  |  最新文章 5 年前
hpaulj
Reply   •   1 楼
hpaulj    6 年前

假设 depth , r c 是鳞片,那么

dout[depth, r, c]

是标量(如果 dout 是3D)

dout[depth, r, c] * w[depth,:,:,:]

w[depth, :, :, :] 是从 w ,即,由 深度 索引。这只是标量乘以子数组中的每个元素,生成一个新数组。

dx[:,r:H,c:W] += dout[depth, r, c] * w[depth,:,:,:]

有效地:

dx[:,r:H,c:W] = dx[:, r:H, c:W] + dout[depth, r, c] * w[depth,:,:,:]

dx[:, r:H, c:W] 是一片 dx 类3D DX 而是沿着第二和第三轴的一个子集。如果切片是正确的,它的形状应该与 w[depth, :,:,:]

我看不到任何花哨的广播或特别行动。它只是从每个数组中提取匹配的大小部分,添加它们并将值放回正确的块中 DX .

颜色运算符只是基本的numpy索引运算符。


dx.shape  (channels, height, width)
dout.shape  (num, m , k)
w.shape   (num, channels, height, width)

有了三维索引, dout[depth, r, c] 形状 杜特 没关系。这只是一个值。

In [295]: 10 * np.arange(12).reshape(3,4)
Out[295]: 
array([[  0,  10,  20,  30],
       [ 40,  50,  60,  70],
       [ 80,  90, 100, 110]])

与标量相乘可以被认为是与充满该值的匹配数组相乘

In [297]: np.full((3,4),10)
Out[297]: 
array([[10, 10, 10, 10],
       [10, 10, 10, 10],
       [10, 10, 10, 10]])

广播规则使得做同样的事情成为可能,但是使用1d、2d或其他大小的数组。但我在你的例子中看不到这种情况,我在这里就不谈了。