Numpy返回数组触发ragged nested sequences警告原因排查
警告触发原因
触发ragged nested sequence警告的核心原因是return语句中尝试拼接的三个子数组维度不统一,numpy无法将其转换为形状规则的数值型多维数组。
结合传入的测试参数逐行推导变量形状即可定位问题:
- 输入
arr形状为(3,4)(即示例中N=4),提取出的delta_right/delta_left/delta_back都是形状为(4,)的一维数组 - 计算得到的
delta_theta形状为(4,),沿axis=0累加得到的delta_theta_cumul形状保持(4,),外层套1次方括号[delta_theta_cumul]后,该子元素维度为(1,4) - 计算
delta_x、delta_y时,给长度为4的一维运算结果额外套了一层np.array(),导致delta_x、delta_y初始形状就变成了(1,4)的二维数组,沿axis=0累加后的delta_x_cumul、delta_y_cumul形状仍为(1,4),再外层套1次方括号后,这两个子元素的维度变成了(1,1,4)
三个待拼接子元素的维度分别是(1,4)、(1,1,4)、(1,1,4),嵌套层级和各层长度都不统一,属于numpy定义的不规则嵌套序列,因此触发对应弃用警告。
修正方法
要得到形状为(3,N)的返回矩阵,只需要去掉计算和返回阶段多余的维度包裹即可,两种改法可选:
- 去掉delta_x、delta_y计算时多余的
np.array()包裹,让三个累加结果都保持(N,)的一维形状,最后直接堆叠:
def get_wheel_status(arr, Dr, Dl, Db): delta_right = arr[0,:] delta_left = arr[1,:] delta_back = arr[2,:] delta_theta = (delta_left - delta_right) / (Dr + Dl) delta_theta_cumul = np.cumsum(delta_theta, axis=0) # 去掉外层多余的np.array()包裹 delta_x = 2*np.sin(delta_theta/2) * ((delta_back / delta_theta) + Db) delta_y = 2*np.sin(delta_theta/2) * ((delta_right / delta_theta) + Dr) delta_x_cumul = np.cumsum(delta_x, axis=0) delta_y_cumul = np.cumsum(delta_y, axis=0) # 三个一维数组直接堆叠,得到形状(3,N)的结果 return np.array([delta_theta_cumul, delta_x_cumul, delta_y_cumul])
- 保留原有计算逻辑的话,用
ravel()把二维的cumul结果拉平成一维,再用vstack按行堆叠,也能得到正确形状的结果:
return np.vstack([ delta_theta_cumul, delta_x_cumul.ravel(), delta_y_cumul.ravel() ])
内容的提问来源于stack exchange,提问作者equanimity
相关产品推荐
相关产品推荐

