numpy 代码是如何工作的“x=np.vstack([range(7)[i:i+3] for i in range(5)])”

fslejnso  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(82)

我在学习numpy和学习“标量和向量,矩阵乘法”中间,我有麻烦。
我想知道下面的代码是如何工作的

x=np.vstack([range(7)[i:i+3] for i in range(5)])

它的结果是

array([[0, 1, 2],
   [1, 2, 3],
   [2, 3, 4],
   [3, 4, 5],
   [4, 5, 6]])

我想知道为什么我需要第一个范围(范围(7)),为什么第一个范围应该是7或更高?
当我做的时候

x=np.vstack([range(3)[1:4])

其结果是

array([[0,1])

所以我假设range(n)必须是显示数量计数
所以我想当我写这样的代码时

x=np.vstack([range(4)[i:i+3] for i in range(5)])

,输出将与范围(7)时相同
但输出为 ValueError:连接轴的所有输入数组维度必须完全匹配,但沿着维度1,索引0处的数组大小为3,索引2处的数组大小为2
为什么?

zrfyljdw

zrfyljdw1#

让我们从里到外

In [171]: [range(7)[i:i+3] for i in range(5)]
Out[171]: [range(0, 3), range(1, 4), range(2, 5), range(3, 6), range(4, 7)]

正如你所看到的,你有一个范围列表,所有的长度都是3,最后一个范围的第二个限制是原始范围的限制。如果我们缩小原始信号的范围会发生什么?

In [172]: [range(6)[i:i+3] for i in range(5)]
Out[172]: [range(0, 3), range(1, 4), range(2, 5), range(3, 6), range(4, 6)]

最后一个范围的长度与前面的其他范围不同,因此整个范围列表是不均匀的,不适合在vstack中使用。
在你的例子中,3是列数ncols,5是结果矩阵的行数nrows,最后一行从nrows-1开始,矩阵的最后一个元素是nrows-1+ncols-1,最后这个数字,正如我们之前看到的,必须严格小于原始范围的宽度,因此,原始范围必须严格大于6,i。即7或更大的数目。
作为最后的说明,使用np.vstack是不必要的,我们使用np.array得到了相同的结果

相关问题