Python数组重塑:为何flatten()比ravel()函数速度慢?
为什么NumPy中flatten()比ravel()速度慢?
先看测试代码:
import numpy as np x = np.arange(1000000) x.shape = 100, 100, 100 %timeit x.flatten() %timeit x.ravel()
二者的速度差异核心在于是否创建数据副本:
ravel()返回的是原数组的视图(View):它只是重新定义了数组的维度描述信息,并没有复制原数组的任何数据,相当于给原数组的数据套了个新的「维度外壳」,所以操作几乎不消耗额外时间和内存。flatten()返回的是原数组的副本(Copy):它会把原数组的所有数据完整复制到一块新的内存空间中,生成一个完全独立的新数组。当数组规模很大时(比如测试里的百万级元素),数据复制的开销会非常显著,这就是它速度远慢于ravel()的根本原因。
可以用简单代码验证这个差异:
import numpy as np x = np.arange(6).reshape(2,3) x_ravel = x.ravel() x_flatten = x.flatten() # 修改原数组的元素 x[0,0] = 99 print(x_ravel[0]) # 输出99,说明ravel的结果和原数组共享数据 print(x_flatten[0]) # 输出0,说明flatten的结果是独立的副本
适用场景总结
- 若只是临时调整数组形状,且不需要修改返回的数组(或希望修改同步到原数组),优先用
ravel(),既快又省内存。 - 若需要对返回的数组做独立修改,不想影响原数组,就用
flatten(),虽然慢但能保证数据独立性。
内容的提问来源于stack exchange,提问作者Matin Rasooli
相关产品推荐
相关产品推荐

