如何在Numpy中对NxM数组的行列运算后插入新元素?
不用循环实现Numpy数组新增计算字段的方法
嘿,这个需求用Numpy的**结构化数组(structured arrays)**就能完美解决,完全不用写那种遍历每个元素的foreach循环~ 先给你理清楚思路:你原来的数组其实是包含字典的object类型数组,这种形式没法让Numpy发挥向量化运算的优势,我们先把它转换成Numpy原生支持的结构化数组,之后就能批量操作字段啦。
步骤1:创建原始结构化数组
首先把你的数据转换成Numpy结构化数组,这样每个元素都是带字段的“结构体”,可以像操作表格列一样批量访问a、b、c字段:
import numpy as np # 构造原始结构化数组,dtype定义了每个字段的名称和数据类型 original_array = np.array([(1, 2, 3), (4, 5, 6)], dtype=[('a', int), ('b', int), ('c', int)])
步骤2:批量计算新字段的值
利用Numpy的向量化运算,直接对整个字段列进行计算,这一步完全没有循环:
# 批量计算d = a + b,e = b - c d_values = original_array['a'] + original_array['b'] e_values = original_array['b'] - original_array['c']
步骤3:新增字段到数组里
这里有两种简洁的方法:
方法一:手动构造新数组(更直观)
我们先定义包含新字段的dtype,再把原字段和新字段的值整合进去:
# 定义新的dtype,在原字段基础上添加d和e new_dtype = original_array.dtype.descr + [('d', int), ('e', int)] # 创建空的新数组,结构和新dtype一致 new_array = np.empty(original_array.shape, dtype=new_dtype) # 复制原字段的值(这里的循环是遍历字段名,不是数组元素,效率极高) for field in original_array.dtype.names: new_array[field] = original_array[field] # 赋值新计算的字段 new_array['d'] = d_values new_array['e'] = e_values
方法二:用Numpy内置工具函数(更省心)
Numpy提供了recfunctions.append_fields工具,专门用来给结构化数组追加字段,一行操作搞定:
from numpy.lib import recfunctions # 直接追加d和e字段,自动处理原字段的复制 new_array = recfunctions.append_fields( original_array, names=['d', 'e'], data=[d_values, e_values], dtypes=[int, int], usemask=False # 不需要掩码数组,直接生成新数组 )
验证结果
最后看看我们得到的结果,和你想要的完全一致:
# 打印结构化数组形式 print(new_array) # 输出:[(1, 2, 3, 3, -1) (4, 5, 6, 9, -1)] # 转换成字典列表形式查看 print(new_array.tolist()) # 输出:[{'a': 1, 'b': 2, 'c': 3, 'd': 3, 'e': -1}, {'a': 4, 'b': 5, 'c': 6, 'd': 9, 'e': -1}]
内容的提问来源于stack exchange,提问作者Andresse Njeungoue
相关产品推荐
相关产品推荐

