如何修复Python循环中的ValueError广播错误?
修复广播错误:
ValueError: operands could not be broadcast together with shapes (10,) (5,) 报错信息
ValueError: operands could not be broadcast together with shapes (10,) (5,)
数据预处理代码
import pandas as pd import numpy as np data1 = pd.DataFrame({"cust_id": ['x111'], #customer data "state": ['B'], "amount": [1000], "year":[3], "group":[10], "loan_rate":[0.12]}) state_list = ['A','B','C','D','E'] #possible states data1['state'] = pd.Categorical(data1['state'], categories=state_list, ordered=True).codes lookup1 = pd.DataFrame({'year': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 'lim %': [0.1, 0.1, 0.1, 0.1, 0.1,0.1, 0.1, 0.1, 0.1, 0.1]}).set_index(['year']) matrix_data = np.arange(250).reshape(10,5,5) #3d matrix by state(A-E) and year(1-10)
循环代码(报错版本)
results={} for cust_id, state, amount, start, group, loan_rate in data1.itertuples(name=None, index=False): res = [amount * matrix_data[start-1, state, :]] for year in range(start+1, len(matrix_data)+1,): temp = np.array([lookup1.loc[year].iat[0]]*len(matrix_data)) temp[3] = temp[4] = 1 res.append(temp * np.array(res[-1])) #报错行 res.append(res[-1] * loan_rate) res.append(res[-1]+ 60) res.append([res[-1] @ matrix_data[year-1]]) results[cust_id] = res
预期输出
{'x111': [array([55000, 56000, 57000, 58000, 59000]), array([ 5500., 5600., 5700., 58000., 59000.]),...
问题分析与解决方案
错误原因
报错行temp * np.array(res[-1])中,temp是长度为10的数组(len(matrix_data)等于10),而res[-1]是长度为5的数组(初始值来自matrix_data[start-1, state, :],第三个维度为5),两者形状不匹配,导致NumPy无法执行广播运算。
修正代码
调整temp的长度为5,匹配res中数组的形状,同时修正最后一行的矩阵乘法结果格式:
results={} for cust_id, state, amount, start, group, loan_rate in data1.itertuples(name=None, index=False): res = [amount * matrix_data[start-1, state, :]] for year in range(start+1, len(matrix_data)+1): # 将temp长度改为5,与res中数组形状一致 temp = np.array([lookup1.loc[year].iat[0]]*5) temp[3] = temp[4] = 1 res.append(temp * np.array(res[-1])) res.append(res[-1] * loan_rate) res.append(res[-1]+ 60) # 去掉多余的[],直接存储点积后的数组 res.append(res[-1] @ matrix_data[year-1]) results[cust_id] = res
关键修改点
- 将
temp = np.array([lookup1.loc[year].iat[0]]*len(matrix_data))改为temp = np.array([lookup1.loc[year].iat[0]]*5),确保temp与res[-1]形状均为(5,),支持逐元素相乘。 - 将
res.append([res[-1] @ matrix_data[year-1]])改为res.append(res[-1] @ matrix_data[year-1]),避免把数组包裹成列表,与预期输出格式一致。
相关问题
如何在嵌套循环中结合np.where使用append?
内容的提问来源于stack exchange,提问作者user1000x
相关产品推荐
相关产品推荐

