看看他们的__array_interface__ 并做一些计时。我能看到的唯一区别是ravel 更快。
.flatten() 有一个更显着的区别 - 它返回一个副本。
A.reshape(-1)
是使用 reshape 的一种更简单的方法。
您可以研究相应的文档,看看是否还有其他内容。我还没有研究过当你指定order 时会发生什么。
如果我只希望它是 1d,我会使用 ravel。我最常使用.reshape 将一维(例如arange())更改为nd。
例如
np.arange(10).reshape(2,5).ravel()
或者选择让你的代码最易读的那个。
reshape和ravel在numpyC代码中定义:
在https://github.com/numpy/numpy/blob/0703f55f4db7a87c5a9e02d5165309994b9b13fd/numpy/core/src/multiarray/shape.c
PyArray_Ravel(PyArrayObject *arr, NPY_ORDER order) 需要将近 100 行 C 代码。如果订单发生变化,它会转至PyArray_Flatten。
在同一个文件中,reshape 平底船到 newshape。这反过来返回一个view 是形状实际上并没有改变,尝试_attempt_nocopy_reshape,最后返回一个PyArray_NewCopy。
两者都使用 PyArray_Newshape 和 PyArray_NewFromDescr - 取决于形状和顺序如何混合和匹配。
因此,确定 reshape (to 1d) 和 ravel 的不同之处需要仔细研究。
另一种方法是创建一个新数组,具有新的形状,但数据缓冲区相同:
np.ndarray((24,),buffer=A.data)
它的时间与reshape 相同。它的__array_interface__ 是一样的。我不推荐使用这种方法,但它可能会澄清这些重塑/拉威尔函数发生了什么。他们都制作了一个新的数组,具有新的形状,但共享数据(如果可能的话)。时序差异是函数调用序列不同(在 Python 和 C 中)的结果,而不是数据处理方式不同的结果。