如何构建一维数组(即行向量)的二维数组的特定结构以满足特定 我正在维护的遗留程序的结构?
我可以在此结构中生成正确的内容
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)
上面的代码生成测试用例数据,但解析器拒绝这种格式的数据,并显示错误消息
数组索引太多:数组是一维的,但索引了 2 个 测量[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)
按照问题解决,我知道行数很小(100 到低 1000),但是将 all_measurements 初始化为空列表,然后迭代附加在内存管理和原始机器周期方面不是非常低效吗?
可以使用 NumPy 的各种数组操作方法,更有效地构建所需的结构,而无需使用循环追加。以下介绍三种方法:
方法 1:使用
reshape
和
newaxis
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 = np.array([ts, Vh*ts, Vy*ts, (v0 + ts*(Vy - gg))])
# 调整数组形状
all_measurements = all_measurements[:,:12] # 取前12列
all_measurements = all_measurements.reshape(-1, 1, 4) # 调整为 (12, 1, 4)
这种方法首先使用广播一次性计算所有时间点的值,然后使用切片提取前 12 列,最后使用
reshape
将其调整为所需的 (12, 1, 4) 形状。
方法 2:使用嵌套列表推导
all_measurements = np.array([[[ts[i], Vh*ts[i], Vy*ts[i], (v0 + ts[i]*(Vy - gg))] for i in range(12)]])
这种方法使用嵌套列表推导式,直接构建所需的嵌套列表结构,然后使用
np.array
将其转换为 NumPy 数组。
方法 3:使用
expand_dims
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)
# 使用 expand_dims 添加维度
all_measurements = np.expand_dims(all_measurements, axis=1)
all_measurements = all_measurements[:12]
这种方法先按照之前的循环方式生成数据,然后使用
np.expand_dims
在指定轴上添加维度,最后使用切片获取前12个元素。
这三种方法都避免了循环追加,并且更加高效。其中,方法 1 最为简洁高效,因为它利用了 NumPy 的广播机制,一次性计算所有值。方法 2 更容易理解,但可能在处理大量数据时效率略低。 方法 3 允许在现有代码的基础上进行修改,更加灵活。可以根据实际情况选择合适的方法。
标签:python,arrays From: 78780767