为什么numpy的object类型嵌套数组无法与标量执行乘除运算?
问题原因
你构造的dtype=object的numpy数组中存储的元素是Python原生列表,原生列表不支持和标量直接做除法运算,所以触发类型错误。
解决方案
方案1:构造数组时直接存储numpy子数组
初始化嵌套数组时,把每个智能体对应的序列提前转为numpy数组,这样就可以直接对单个子数组做标量运算:
import numpy as np # 构造时每个子元素都转为numpy数组 arrayofarrays = np.array([np.array([1,2,3]), np.array([1.1,6]), np.array([1])], dtype=object) # 此时可正常运算单个智能体数组 print(2 / arrayofarrays[0]) # 输出:[2. 1. 0.66666667] # 全量运算可通过遍历实现 result = np.array([2 / sub_arr for sub_arr in arrayofarrays], dtype=object)
方案2:已有object数组的转换方法
如果嵌套数组已经构造完成,内部存储的是原生列表,遍历每个子元素转为numpy数组后再做运算即可:
# 已有存储原生列表的object数组 arrayofarrays = np.array([[1,2,3],[1.1,6],[1]], dtype=object) # 遍历转换后运算 result = [2 / np.array(sub_list) for sub_list in arrayofarrays] # 如果需要保留object dtype的numpy数组格式 result_np = np.array(result, dtype=object)
方案3:对齐为规则二维数组(推荐,性能最优)
如果你的业务场景可以接受用NaN填充短数组的空缺位置,建议把不等长的子数组合并为规则的二维numpy数组,不需要用object dtype,可以直接享受numpy的向量化运算加速,尤其在智能体数量大时性能提升非常明显:
arrayofarrays = np.array([[1,2,3],[1.1,6],[1]], dtype=object) max_length = max(len(sub) for sub in arrayofarrays) # 初始化全NaN的二维数组 padded_array = np.full((len(arrayofarrays), max_length), np.nan) # 填充子数组内容 for idx, sub in enumerate(arrayofarrays): padded_array[idx, :len(sub)] = sub # 直接全局运算,无需遍历 result = 2 / padded_array print(result) # 输出: # [[2. 1. 0.66666667] # [1.81818182 0.33333333 nan] # [2. nan nan]]
内容的提问来源于stack exchange,提问作者Ged
相关产品推荐
相关产品推荐

