循环拼接一维NumPy数组如何得到目标格式二维数组
问题根源
原有代码生成的arr和循环内临时变量x均为一维数组,np.concatenate拼接一维数组时只会沿唯一的现有维度合并,不会自动新增维度,最终输出会被拍平为一维结构,无法得到预期的二维数组。
可行实现方案
方案1:高性能列表收集法(推荐)
numpy数组为定长结构,循环中反复调用np.append/np.concatenate会触发全量数据的内存重分配与拷贝,数据量较大时性能很差。优先用普通Python列表按行收集结果,最后一次性转为numpy数组即可:
import numpy as np nNumbers = [1,2,3] baseVariables = ['a','b','c','d','e'] row_cache = [] for idx in nNumbers: # 按指定字段顺序提取当前行的所有值 current_row = [y['result'][idx][field] for field in baseVariables] row_cache.append(current_row) # 直接转换为二维数组,形状为 (len(nNumbers), len(baseVariables)) arr = np.array(row_cache)
运行后得到的arr完全匹配你预期的二维结构,对应你给出的示例格式为3行5列的数组。
方案2:最小改动适配原有逻辑
如果需要保留原有循环逐值append的写法,只需要调整数组初始化逻辑与拼接维度即可:
import numpy as np nNumbers = [1,2,3] baseVariables = ['a','b','c','d','e'] # 初始化空二维数组,列数与待提取字段数保持一致,存字符串需指定dtype arr = np.empty((0, len(baseVariables)), dtype=object) for i in nNumbers: x = np.empty(0, dtype=object) for v in baseVariables: x = np.append(x, y['result'][i][v]) # 将一维的x转为单行二维数组,沿行方向拼接 arr = np.concatenate((arr, x.reshape(1, -1)), axis=0)
注意事项
- 如果你提取的字段值是字符串类型,初始化numpy数组时需要指定
dtype=object或对应字符串类型(如dtype='U20'表示最长20位的Unicode字符串),避免默认数值dtype无法存储字符串。 - 非必要不要在循环中频繁修改numpy数组长度,列表收集法的执行效率会比逐次拼接numpy数组高几个数量级。
内容的提问来源于stack exchange,提问作者Zercon
相关产品推荐
相关产品推荐

