Lambda函数与NumPy数组结合时常量未生成对应长度数组的异常问题咨询
问题原因及解决方案
你遇到的问题核心在于numpy数组的创建规则和广播机制,让我一步步拆解清楚:
为什么会返回[1, array([...])]?
当你用np.array([1, np.cos(x)+0.02*x])创建数组时:
1是一个Python标量,而np.cos(x)+0.02*x是一个和x同形状的numpy数组- numpy无法自动将标量
1扩展为和右侧数组同形状的数组,因此它会创建一个object类型的数组:第一个元素是标量1,第二个元素是你的导数数组。这就导致你解包时得到的x_1是单个标量,而不是全1的数组。
对比你的function函数:lambda x: np.array([x, np.sin(x)+0.01*x**2]),这里第一个元素x本身就是numpy数组,和第二个元素形状完全一致,所以numpy会创建一个二维数组,解包时自然能得到两个同形状的数组。
如何修复?
只需要把标量1替换成和x同形状的全1数组即可,用np.ones_like(x)就能轻松实现:
function_der_1 = lambda x: np.array([np.ones_like(x), np.cos(x) + 0.02 * x])
这样当你传入x = np.array([1,3,4])时,返回的就是两个同形状的数组,解包后x_1是全1数组,y_1是对应的导数值数组,完全符合你的预期。
验证示例效果
当输入x = np.array([1,3,4])时:
np.ones_like(x)会生成array([1., 1., 1.])np.cos(x)+0.02*x计算后是array([0.56030231, -0.9299925 , -0.57364362])- 最终返回的数组是:
解包后就能得到你想要的两个独立数组。array([[1. , 1. , 1. ], [0.56030231, -0.9299925 , -0.57364362]])
另外,也可以用更灵活的写法替代,比如直接返回列表(让numpy自动处理形状对齐):
function_der_1 = lambda x: [np.ones_like(x), np.cos(x) + 0.02 * x]
内容的提问来源于stack exchange,提问作者justuswolff
相关产品推荐
相关产品推荐

