Python循环中append报错:numpy.ndarray无append属性的解决方法
问题修正:循环中调用append触发AttributeError
报错信息
AttributeError Traceback (most recent call last) in
17 dest_depth = np.arange(0,max_depth,0.05)
18 vel_dd = interp1d(depth_z,vel_line,kind='linear',bounds_error=False,fill_value=n.nan,axis=0)(dest_depth)
---> 19 ypred_2D_dd.append(vel_dd)
20 z_stack_length.append(len(dest_depth))
21 ypred_2D_dd = np.array(ypred_2D_dd)AttributeError: 'numpy.ndarray' object has no attribute 'append'
原代码
from scipy.interpolate import interp1d # ypred_2D (1280,251) #convert to depth domain n = ypred_2D.shape[1] #number of shots dt=8e-11 ypred_2D_dd = [] z_stack_length = [] for i in range(n): vel_line = ypred_2D[:,i] depth_z = np.cumsum(vel_line * dt, axis=0) / 2 depth_z = np.insert(depth_z[:1280-1],0,0,axis=0) max_depth = np.max(depth_z) dest_depth = np.arange(0,max_depth,0.05) vel_dd = interp1d(depth_z, vel_line,kind='linear',bounds_error=False,fill_value=np.nan,axis=0)(dest_depth) ypred_2D_dd.append(vel_dd) z_stack_length.append(len(dest_depth)) ypred_2D_dd = np.array(ypred_2D_dd) z_stack_length = np.array(z_stack_length) min_z = np.min(z_stack_length) vel_dd_img_corr = [] for i in range(n): vel_line = ypred_2D_dd[i][:min_z] vel_dd_img_corr.append(vel_line) vel_dd_img_corr = np.array(vel_dd_img_corr).T vel_dd_img_corr[:10,:] = 299792500 ep_ypred = 299792500**2 / vel_dd_img_corr **2 #save #sio.savemat('Synthetic/Data/2D/ep_ypred2D.mat',{'ep':ypred_2D_dd})
错误原因
第一次循环执行时,你把初始的列表ypred_2D_dd转成了numpy数组,第二次循环再调用.append()方法时,因为numpy数组没有这个实例方法,直接触发报错。另外第二个循环里也存在同样的问题:每次循环都会把vel_dd_img_corr转成数组,后续循环的append操作同样会失败。
修正后的代码
from scipy.interpolate import interp1d # ypred_2D (1280,251) # convert to depth domain n = ypred_2D.shape[1] # number of shots dt = 8e-11 ypred_2D_dd = [] z_stack_length = [] # 第一个循环:先完成所有元素的append,再转numpy数组 for i in range(n): vel_line = ypred_2D[:, i] depth_z = np.cumsum(vel_line * dt, axis=0) / 2 depth_z = np.insert(depth_z[:1280-1], 0, 0, axis=0) max_depth = np.max(depth_z) dest_depth = np.arange(0, max_depth, 0.05) vel_dd = interp1d( depth_z, vel_line, kind='linear', bounds_error=False, fill_value=np.nan, axis=0 )(dest_depth) ypred_2D_dd.append(vel_dd) z_stack_length.append(len(dest_depth)) # 循环结束后再转numpy数组 ypred_2D_dd = np.array(ypred_2D_dd) z_stack_length = np.array(z_stack_length) min_z = np.min(z_stack_length) vel_dd_img_corr = [] # 第二个循环:同样先完成append,再转数组和后续处理 for i in range(n): vel_line = ypred_2D_dd[i][:min_z] vel_dd_img_corr.append(vel_line) # 循环外转数组并处理 vel_dd_img_corr = np.array(vel_dd_img_corr).T vel_dd_img_corr[:10, :] = 299792500 ep_ypred = 299792500**2 / vel_dd_img_corr **2 # save # sio.savemat('Synthetic/Data/2D/ep_ypred2D.mat',{'ep':ypred_2D_dd})
关键修正点
- 将
ypred_2D_dd = np.array(ypred_2D_dd)和z_stack_length = np.array(z_stack_length)移到第一个循环外部,确保所有列表元素追加完成后再转换为numpy数组。 - 第二个循环中,把
vel_dd_img_corr = np.array(vel_dd_img_corr).T及后续处理代码移到循环外,避免每次循环覆盖列表并触发同样的错误。
内容的提问来源于stack exchange,提问作者Kau
相关产品推荐
相关产品推荐

