如何修改Python NumPy代码,实现循环中向空矩阵追加迭代数组?
问题分析
原代码存在三个核心问题:
- 每次循环用
np.append(Q, Q, axis=0)直接覆盖storage_Q,没有实现“追加新数组到存储矩阵”的逻辑,最终只保留了最后一次迭代的Q并重复两次 - 初始定义的
storage_Q为object类型空矩阵,既无必要也未被实际使用 - 循环逻辑未正确累积每一步生成的
Q值
修改方案
推荐两种可行的修改方式:
方式一:列表收集结果后转数组(高效首选)
numpy数组的append操作每次都会重新分配内存,循环中频繁调用效率较低。更优的做法是先用普通列表收集每一步的结果,最后统一转换为numpy数组:
import numpy as np Q = np.array([[10,20,3]]) storage_list = [] TotalK = 6 for k in range(TotalK): Q = Q + [[2,0,1]] storage_list.append(Q[0]) # 提取一维数组存入列表 storage_Q = np.array(storage_list) print(storage_Q)
运行输出:
[[12 20 4] [14 20 5] [16 20 6] [18 20 7] [20 20 8] [22 20 9]]
方式二:numpy逐步追加(适合必须用矩阵操作的场景)
如果坚持用numpy的追加逻辑,需要初始化空的二维数组,每次将新生成的Q追加到已有矩阵中,而非覆盖:
import numpy as np Q = np.array([[10,20,3]]) storage_Q = np.empty((0, 3)) # 初始化空的二维数组 TotalK = 6 for k in range(TotalK): Q = Q + [[2,0,1]] storage_Q = np.append(storage_Q, Q, axis=0) storage_Q = storage_Q.astype(int) # 转换为整数类型 print(storage_Q)
该方案同样能得到预期结果,注意初始数组需定义为(0,3)的形状,确保追加时维度匹配。
补充提示
- 方式一的列表收集在循环次数较多时效率远高于numpy反复追加,因为列表的动态扩容机制比numpy数组的内存重分配更灵活
- 原代码中
storage_Q = np.empty((6,3), dtype = object)属于冗余代码,可直接删除
内容的提问来源于stack exchange,提问作者Nicholas Nicholas
相关产品推荐
相关产品推荐

