37.1_对各元素进行计算

37.1 对各元素进行计算

此前我们实现了多个DeZero函数,如add、mul、div和sin等。在实现这些函数时,我们假设输入和输出都是标量。例如在实现sin函数时,我们假设了以下情况。

import numpy as np   
importdezero-functionsasF   
fromdezero importVariable   
 $\mathbf{x} =$  Variable(np.array(1.0))   
y  $=$  F.sin(x)   
print(y)

运行结果

variable(0.84147098)

上面例子中的 xx 是作为单一值的标量(准确来说,是一个零维的ndarray实例)。此前我们假定处理的是这类标量,并以此实现了DeZero。如果 xx 是张量(比如矩阵),又会发生什么呢?此时sin函数会应用到每个元素上。实际运行的结果如下所示。

$\mathbf{x} =$  Variable(np.array([[1,2,3],[4,5,6]]))  
y  $=$  F.sin(x)  
print(y)

运行结果

variable([[0.84147098 0.90929743 0.14112001] [-0.7568025 -0.95892427 -0.2794155]])

上面的代码对 xx 的每个元素都应用了sin函数。因此,输入和输出的张量的形状没有发生变化。具体来说,输入 xx 的形状是(2,3),输出y的形状也是(2,3)。像这样,之前实现的DeZero函数会对每个元素进行计算。例如,在加法运算的情况下,DeZero函数也会按照以下方式对每个元素进行计算。

$\begin{array}{rl} & {\mathrm{x = V�ariable(np.array([[1,2,3],[4,5,6]]})}}\\ & {\mathrm{c = V�ariable(np.array([[10,20,30],[40,50,60]]))}}\\ & {\mathrm{y = x + c}}\\ & {\mathrm{print(y)}} \end{array}$

运行结果

variable([[11 22 33] [44 55 66])

上面的代码通过对x和c逐元素相加,得到了y的结果。因此,输出y的形状与x和c的相同。

在上面的代码中,x的形状和c的形状应该是相同的。这样就能在张量的元素之间建立一对一的关系。此外,NumPy还有一个叫广播的功能。该功能的作用是当x和c的形状不同时,自动复制数据,并将其转换为形状相同的张量。笔者将在步骤40中详细介绍广播功能。