如何构建适配遗留程序的一维数组组成的特定二维array结构?
遗留程序数组结构适配与性能疑问
问题背景
维护遗留程序时,需要构建一种特殊结构的二维数组:外层数组的每个元素必须是一个shape为(1,4)的numpy子数组。
当前生成的数组结构
all_measurements[:12] array([[0. , 0. , 0. , 2. ], [0.02 , 0.334, 0.04 , 2.24 ], [0.04 , 0.668, 0.08 , 2.48 ], ..... ])
程序要求的目标结构
array([array([[0. , 0. , 0. , 2. ]]), array([[0.02 , 0.334, 0.04 , 2.24 ]]), array([[0.04 , 0.668, 0.08 , 2.48 ]]), ..... ])
原实现代码
import numpy as np dt = 1/50; nt = 350 Vh = 16.7; Vv = 20.6; Vy = 2 gg = -10; v0 = +2 it = np.arange(nt) ts = dt * it all_measurements = [] for i in range(12): row = np.array([ts[i], Vh*ts[i], Vy*ts[i], (v0 + ts[i]*(Vy - gg))]) all_measurements.append(row) all_measurements = np.array(all_measurements)
报错信息
too many indices for array: array is 1-dimensional, but 2 were indexed
measurements[row_list[np.where(column_list == i)[0]],:])
修正后的代码
通过调整每行的数组嵌套结构,解决了解析报错:
for i in range(nt): row = np.array([np.array([ts[i], Vh*ts[i], Vy*ts[i], (v0 + ts[i]*(Vy - gg *ts[i]))])]) all_measurements.append(row)
后续性能疑问
我知道行数不多(几百到一千左右),但初始化空列表后迭代追加元素,在内存管理和计算性能上是否存在低效问题?
解答
针对几百到一千行的规模,列表迭代追加的方式几乎不存在明显的性能或内存低效问题,原因如下:
- Python列表内部会预分配额外内存空间,不会每次追加都触发扩容操作,对于千级别的元素,扩容次数极少,额外开销可以忽略。
- 每个
(1,4)的numpy子数组内存占用极小,即使一千个这样的数组,总内存消耗也微乎其微,不会造成内存压力。
如果想要进一步优化,可以利用numpy的向量化计算一次性生成所有数据,再构造目标结构,避免逐行循环:
import numpy as np dt = 1/50; nt = 350 Vh = 16.7; Vv = 20.6; Vy = 2 gg = -10; v0 = +2 it = np.arange(nt) ts = dt * it # 向量化计算所有行数据,shape为(nt,4) data = np.column_stack([ ts, Vh * ts, Vy * ts, v0 + ts * (Vy - gg * ts) ]) # 转换为目标结构:外层数组的每个元素是(1,4)的子数组 all_measurements = np.array([np.array([row]) for row in data])
这种方式的效率比逐行循环更高,但对于千级别的数据量,两种方式的性能差异用户几乎感知不到。
内容的提问来源于stack exchange,提问作者Donovan Roisin
相关产品推荐
相关产品推荐

