2 回答
TA贡献1818条经验 获得超3个赞
简而言之,numpy ndarrays 有这个属性叫做 stride,也就是
要在内存中跳过以继续到下一个元素的字节数。例如,对于 (10, 10) 字节数组,步长可能是 (10, 1),换句话说:前进一个字节以到达下一列,前进 10 个字节以定位下一行。
对于您的 ndarray a
,a.stride
= (8,)
,这表明它只是一维的,并且要到达该一维上的下一个元素,您需要在内存中提前 8 个字节(每个 int 是 64 位)。
步幅对于表示转置很有用:
例如,通过修改步幅,可以零成本转置或重塑数组(无需复制内存)。
因此,如果有一个二维 ndarray,b = np.ones((3,5))
例如,然后b.strides
= (40, 8)
,而b.transpose().strides
= (8, 40)
。因此,如您所见,转置的 2D-ndarray 只是完全相同的数组,其步幅已重新排序。而且由于您的一维 ndarray 只有一维,因此交换其步幅的值(即取其转置)不会做任何事情。
TA贡献1850条经验 获得超11个赞
正如您已经提到的,numpy 数组不是矩阵。转置函数的定义如下
置换数组的维度。
这意味着 numpy 的转置方法会将数据从一个维度移动到另一个维度。由于一维数组只有一个维度,因此没有其他维度可以移动数据 t0。所以你需要在转置有任何效果之前添加一个维度。这种行为对于与更高维数组(3D、4D ...)数组保持一致也是有意义的。
有一种干净的方法可以实现您想要的
N = 10
a = np.arange(N)
a[ :, np.newaxis]
添加回答
举报