如何高效重塑一维数组:每行保留指定数量样本
一维数组高效重塑为指定二维数组的方案
需求说明
将一维数组重塑为二维数组,第一行包含样本0至7,第二行包含样本8至15,以此类推。
输入示例
array([ 0, 1, 2, ..., 1277, 1278, 1279])
输出示例
array([[ 0, 1, 2, ..., 1221, 1222, 1223], [ 8, 9, 10, ..., 1229, 1230, 1231], [ 16, 17, 18, ..., 1237, 1238, 1239], ..., [ 40, 41, 42, ..., 1261, 1262, 1263], [ 48, 49, 50, ..., 1269, 1270, 1271], [ 56, 57, 58, ..., 1277, 1278, 1279]])
现有实现代码
import numpy as np data = np.arange(0, 128*10) # Reshape for S/H temp = data.reshape(8*8, -1, order='F') out = np.zeros((8, int(len(data)/8))) for idx in range(0, 8): out[idx] = temp[idx*8: idx*8+8, :].ravel(order = 'F')
高效替代方案
可以完全利用NumPy的向量化操作替代显式循环,避免Python循环的性能开销,代码更简洁且效率更高:
import numpy as np data = np.arange(0, 128*10) # 高效重塑操作 out = data.reshape(8, 8, -1).transpose(0, 2, 1).reshape(8, -1)
步骤解释
- 第一步reshape:将原一维数组拆分为三维数组
(8,8,N),其中N = 总长度/(8*8),这一步把数据按8个一组、共8组的方式初步拆分。 - transpose转置:将三维数组的轴调整为
(8,N,8),让原本分散的同组元素变成连续的列。 - 第二步reshape:将三维数组压平为二维数组
(8, -1),直接得到目标格式的结果。
这种方法依赖NumPy的底层C语言优化,比显式Python循环快得多,尤其在处理大规模数据时优势更明显。
内容的提问来源于stack exchange,提问作者MrG
相关产品推荐
相关产品推荐

