n维数组,也称为张量(tensor)。无论使用哪个深度学习框架,它的张量类(在MXNet中为ndarray, 在PyTorch和TensorFlow中为Tensor)都与Numpy的ndarray类似。
我们可以使用 arange
创建一个行向量 x
。这个行向量包含以0开始的前12个整数,它们默认创建为整数。
可以通过张量的shape
属性来访问张量(沿每个轴的长度)的形状
要想改变一个张量的形状而不改变元素数量和元素值,可以调用reshape
函数。
例如:这里x是维度为12的向量,把它变为3行4列的张量。
如果我们的目标形状是(高度,宽度), 那么在知道宽度后,高度会被自动计算得出,不必我们自己做除法。 在上面的例子中,为了获得一个3行的矩阵,我们手动指定了它有3行和4列。 幸运的是,我们可以通过-1
来调用此自动计算出维度的功能。 即我们可以用x.reshape(-1,4)
或x.reshape(3,-1)
来取代x.reshape(3,4)
。
创建一个形状为(2,3,4)的张量,其中所有元素都设置为0。
创建一个形状为(2,3,4)的张量,其中所有元素都设置为1。
创建一个形状为(3,4)的张量,每个元素都从均值为0、标准差为1的标准高斯分布(正态分布)中随机采样
。
我们还可以通过提供包含数值的Python列表(或嵌套列表),来为所需张量中的每个元素赋予确定值。([ ]方括号表示列表)
在这里,最外层的列表对应于轴0,内层的列表对应于轴1。
将标准标量运算符应用于数组的每个元素。对于将两个数组作为输入的函数,按元素运算将二元运算符应用于两个数组中的每对位置对应的元素
。
(1)[常见的标准算术运算符(+
、-
、*
、/
和**
)都可以被升级为按元素运算]。我们可以在同一形状的任意两个张量上调用按元素操作。
(2)指数运算
[我们也可以把多个张量连结(concatenate)在一起],
我们只需要提供张量列表,并给出沿哪个轴连结。
下面的例子分别演示了当我们沿行(轴0,形状的第一个元素)和按列(轴1,形状的第二个元素)连结两个矩阵时,会发生什么情况。
我们可以看到,第一个输出张量的轴0长度( 6 6 6)是两个输入张量轴-0长度的总和( 3 + 3 3 + 3 3+3);
第二个输出张量的轴1长度( 8 8 8)是两个输入张量轴-1长度的总和( 4 + 4 4 + 4 4+4)。
以X == Y
为例:
对于每个位置,如果逻辑语句X == Y
在该位置处为真,则新张量中相应项的值为1,否则该位置为0。
广播:首先,通过适当复制
元素来扩展一个或两个数组, 以便在转换之后,两个张量具有相同的形状。 其次,对生成的数组执行按元素操作
。
于a和b分别是3x1和1x2矩阵,如果让它们相加,它们的形状不匹配。
矩阵a将复制列, 矩阵b将复制行,然后再按元素相加。
[可以用[-1]
选择最后一个元素,可以用[1:3]
选择第二个和第三个元素]
[1:3]也就是选择[1,3)内的数,也就是1和2。
[指定索引来将元素写入矩阵。]
如果我们想[为多个元素赋值相同的值,我们只需要索引所有元素,然后为它们赋值。]
例如,[0:2, :]
访问第1行和第2行,其中“:”代表沿轴1(列)的所有元素。
[运行一些操作可能会导致为新结果分配内存]。
例如,如果我们用Y = X + Y
,我们将取消引用Y
指向的张量,而是指向新分配的内存处的张量。
在下面的例子中,我们用Python的id()
函数演示了这一点,
它给我们提供了内存中引用对象的确切地址。
运行Y = Y + X
后,我们会发现id(Y)
指向另一个位置。
这是因为Python首先计算Y + X
,为结果分配新的内存,然后使Y
指向内存中的这个新位置。
我们可以使用切片表示法
将操作的结果分配给先前分配的数组,例如Y[:] =
。
[如果在后续计算中没有重复使用X
,
我们也可以使用X[:] = X + Y
或X += Y
来减少操作的内存开销。]
numpy数组转换为torch张量
将共享它们的底层内存,就地操作更改一个张量也会同时更改另一个张量。
其他
要(将大小为1的张量转换为Python标量),我们可以调用item
函数或Python的内置函数。