数据操作

做了一下,不知道对不对。。

源码:def reshape(self, *shape: _int)。
*shape可以接收元组,也可分开接收。

@AI_M 我还是没弄明白 :sob: :heart:

使用 arange 创建一个行向量 x这里,其实创建的是一维向量吧?无关行向量还是列向量?(根据我查到的资料显示)

练习的第二问为什么我的没有实现

  1. ⽤其他形状(例如三维张量)替换⼴播机制中按元素操作的两个张量。结果是否与预期相同?

我猜测是因为3不能被2整除导致无法进行广播。如果你将X形状改变为(2,1,3),将Y形状改变为(1,3,1),那么应该可以顺利实现广播。

谢谢,是的,由于广播原则的限制,从直观上也可以理解,扩展的时候无法确定是按照2中的哪个元素复制,所以不可以进行。(原问题已解决)

我个人总结的广播原则:
维度按照右对齐后,需要复制的维度只有一行/列或者为空,其余行/列不需要复制。

这个可以复制成功,因为需要复制的维度全部是1
a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
a+b

可以复制成功,因为右对齐后第一个维度为空,且要复制的维度为1
a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((2))
a+b

这个无法复制,因为要复制的有两列
a = torch.arange(18).reshape((3,6))
b = torch.arange(6).reshape((3,2))
a+b

这种可以复制,因为只有一行需要复制
a = torch.arange(18).reshape((3,6))
b = torch.arange(6).reshape((1,6))
a+b

这种不能复制,因为第一维需要复制的有两行

a = torch.arange(12).reshape((2,2,3))
b = torch.arange(12).reshape((6,2,1))
a+b

1 Like

两个张量的维度大小向右对齐,触发广播机制的条件:
a. 同一维度大小相等;
或 b. 某个维度 一个张量有,另一个张量没有 ;
或 c. 某个维度 一个张量有,另一个张量也有且大小不同,但大小是1。
参考

我用的是python3.9.12,方法2中改变a的形状,例如 a = numpy.ones(6),b不会改变;但是改变a某个元素的值,b会改变,这是为什么

2.1.2开头的末尾:我们使用逗号来表示一个具有5个元素的元组;好像写错了,下面明明是4个元素