Numpy中当轴数已知时,X.ravel()和X.reshape(s0 * s1 * s2)之间的区别
在本文中,我们将介绍当轴数已知时,Numpy库中的X.ravel()和X.reshape(s0 * s1 * s2)之间的区别。
阅读更多:Numpy 教程
X.ravel()
X.ravel()是将多维数组降为一维数组的函数。当我们使用X.ravel()函数时,它将会返回一个数组的扁平版本,这个版本中所有的元素都位于同一个一维数组中。在这个新的扁平数组中,元素的排列顺序是从左到右、从上到下的,这与我们通常使用的矩阵电路图非常相似。
例如,如果我们使用下面的代码:
这将输出:[1 2 3 4 5 6]
。
X.reshape(s0 * s1 * s2)
X.reshape(s0 * s1 * s2)是将多维数组重构为新形状的函数。 当我们使用X.reshape(s0s1s2)函数时,它将会返回一个具有新形状的新数组,但是原始数组的数据不会发生改变。
例如,如果我们使用下面的代码:
这将输出:[1 2 3 4 5 6]
。
区别
尽管X.ravel()和X.reshape(s0 * s1 * s2)都有将多维数组转换为一维数组的功能,但它们之间有一些差别。
最大的区别就在于,当源数组的形状发生变化时,X.ravel()函数将返回一个修改后的数据集,而X.reshape(s0s1s2)函数则将返回一个基于原始数据构建的新数组。
具体来说,如果我们对上面的代码进行一些改变,就能体现这一点:
这将输出:
现在,我们使用X.ravel()函数来创建一个新数组。我们然后需要将新数组的第一个元素修改为99。但请注意,我们打印的结果包含了原始数组。这是因为对X.ravel()函数返回的新数组进行的任何修改都会影响原始数组:这两个Numpy数组实际上是相互关联的。
使用X.reshape(s0 * s1 * s2)函数来构建新数组时,就不会发生这种情况,因为X.reshape(s0 * s1 * s2)总是创建一个与原始数组不同的新数组:
这将输出:
现在,我们使用X.reshape(s0 * s1 * s2)函数来创建新数组。我们然后需要将新数组的第一个元素修改为99。请注意,这次打印的结果不再包含原始数组。这是因为对于X.reshape(s0 * s1 * s2)函数返回的新数组所做的任何更改都不会影响原始数组。
因此,当我们需要将一个多维数组变形为一维数组,但又不希望在原始数组上进行操作时,最好使用X.reshape(s0 * s1 * s2)函数。
总结
当轴数已知时,Numpy库中的X.ravel()和X.reshape(s0 * s1 * s2)函数的作用非常相似:它们都将多维数组转换为一维数组。
但是,它们之间最大的区别在于,使用X.ravel()函数转换数组时,返回的数组与原始数组共享数据,对新数组进行的任何更改都会影响原始数组。而使用X.reshape(s0 * s1 * s2)函数转换数组时,返回的是一个新数组,对新数组进行的更改不会影响原始数组。因此,在需要将多维数组变形为一维数组时,最好使用X.reshape(s0 * s1 * s2)函数,避免对原始数组造成不必要的影响。