我在学习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
为什么?
1条答案
按热度按时间zrfyljdw1#
让我们从里到外
正如你所看到的,你有一个范围列表,所有的长度都是3,最后一个范围的第二个限制是原始范围的限制。如果我们缩小原始信号的范围会发生什么?
最后一个范围的长度与前面的其他范围不同,因此整个范围列表是不均匀的,不适合在
vstack
中使用。在你的例子中,3是列数
ncols
,5是结果矩阵的行数nrows
,最后一行从nrows-1
开始,矩阵的最后一个元素是nrows-1+ncols-1
,最后这个数字,正如我们之前看到的,必须严格小于原始范围的宽度,因此,原始范围必须严格大于6,i。即7或更大的数目。作为最后的说明,使用
np.vstack
是不必要的,我们使用np.array
得到了相同的结果