You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 08:15:37