出现这种报错,首先查看numpy的版本是否是最新的,如果更新之后还是不行,则看下面。
①找到报错的那行,对它debug
ttp = np.round(np.divide(tp, dt)) # 将时间分格
②从报错提示来看,是说不能进行divide,也就是tp,dt对应不上,这时先看下大小是否一致,如果一致,则检查tp,dt中是不是那个出现了问题,才导致对应不上。
③我的dt就是一个数字128,divide的操作就是将tp分成128格,因此dt肯定没问题,那么就是tp的问题了。
④debug查看tp(是一个列表),发现它前62个参数都为{ndarray:(500,)},
后面的都是{float64:()},这也说明tp内部就没没统一好格式。
⑤解决方法:将(500,)转为float64,也就是一个数字,因为我是算的时候出现了错误,误算了500个同样的值,因此只需要取一个出来即可。
l0 = (dp0[0] - ry[i]) / math.cos(theta0) #因为dp0是有500个,则也会生成500个,只需要选出一个即可计算--dp[0]
⑥相应部分代码块如下:
for z in range(10):
rx = list() #x,y,z三分量检波器
ry = list()
#rz=list()
r = list()
tp = list()
tp0=list()
tp1=list()
# 设置层,深度--速度
depth = np.arange(0, 1201, 1)
dp = np.empty(shape=1201, )
v_dp = np.squeeze(v)
dp[:500] = v_dp[z][0]
dp[500:] = v_dp[z][1]
dp0 = dp[:500] # 第一层
dp1 = dp[500:] # 第二层
for i in range(63): #取0--62个,则刚好都在第一层
rx.append(100) #地面排列 测线平行于x轴,均匀介质无所谓,层状介质,则要改为平行于y轴,即对y改变
ry.append(8*i)
a = math.pi / 12
b = math.pi / 3
theta = random.uniform(a, b) # 生成a,b之间的随机数
theta0 = math.asin(math.sin(theta) * v[z][0] / v[z][1]) # v[z][0]/v[z][1]不能大于1,否者会ValueError: math domain error,则要先对v排序
# 距离用坐标和角度来算,固定了theta,theta0也就确定了,加上又是在地面,因此用不上检波器的坐标
l0 = (dp0[0] - ry[i]) / math.cos(theta0) #因为dp0是有500个,则也会生成500个,只需要选出一个即可计算--dp[0]
l1 = (ss[1] - dp0[0]) / math.cos(theta)
t0 = l0 / v[z][0]
t1 = l1 / v[z][1]
t = t0 + t1
tp.append(t) #得到第一层检波器的时间
#print(type(tp0))
for j in range(63,nr):
rx.append(100) #地面排列 测线平行于x轴,均匀介质无所谓,层状介质,则要改为平行于y轴,即对y改变
ry.append(8*j)
#rz.append(i*30)
r.append(math.sqrt((rx[j] - ss[0]) ** 2 + (ry[j] - ss[1]) ** 2)) # 计算距离,删掉了rz ,这样也对应了震源为xy轴
tp.append(r[j-63] / v[z][1]) # 得到第二层检波器所测的时间
ttp = np.round(np.divide(tp, dt)) # 将时间分格